MSa*_*sli 1 c++ java android opencv bitmap
我正在Android上使用OpenCv进行图像处理.在作为教程3的OpenCv示例中,它们使用本机代码,并且它们将帧数据从java部分发送到jni部分作为字节数组.然后他们将字节数组转换为mat.最后,他们正在处理mat变量并将其返回给show.
像这样,我想把drawable发送到jni部分.首先,我将drawable转换为位图,并将位图转换为字节数组,如下所示;
private Bitmap my_bitmap;
private byte[] process_data;
-o-
Drawable myDrawable = getResources().getDrawable(R.drawable.test);
my_bitmap = ((BitmapDrawable) myDrawable).getBitmap();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
mybitmap.compress(CompressFormat.PNG, 100, stream);
process_data = stream.toByteArray();
Run Code Online (Sandbox Code Playgroud)
然后我将这个字节数组发送到jni部分然后我从jni给出int数组并创建位图;
int[] rgba = mRGBA;
Test(p_width, p_height, process_data, rgba); //This is jni function
Bitmap bmp = Bitmap.createBitmap(p_width, p_height, Bitmap.Config.ARGB_8888);
bmp.setPixels(rgba, 0, p_width, 0, 0, p_width, p_height);
Run Code Online (Sandbox Code Playgroud)
但是返回的位图就像噪声一样.
这是我的c ++代码;
JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial3_Sample3View_Test(JNIEnv* env, jobject thiz,
jint width, jint height, jbyteArray p_data, jintArray bgra)
{
jbyte* _p_data= env->GetByteArrayElements(p_data, 0);
jint* _bgra = env->GetIntArrayElements(bgra, 0);
Mat mdata(height, width, CV_8UC4, (unsigned char *)_p_data);
Mat mbgra(height, width, CV_8UC4, (unsigned char *)_bgra);
mdata.copyTo(mbgra);
env->ReleaseIntArrayElements(bgra, _bgra, 0);
env->ReleaseByteArrayElements(p_data, _p_data, 0);
}
Run Code Online (Sandbox Code Playgroud)
可能,我犯了错误的转换类型.因为我无法找到有关转换字节后可绘制多少通道的任何信息.我在等你的帮助来解决我的问题.
提前致谢.
我解决了我的问题.如果有人面临同样的问题,他们可以解决这样的问题;
问题出现在我的代码的jni部分.我们必须在jni部分解码图像字节数组.我编辑了这样的代码;
JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial3_Sample3View_Test(JNIEnv* env, jobject thiz,
jint width, jint height, jbyteArray p_data, jintArray bgra)
{
jbyte* _p_data= env->GetByteArrayElements(p_data, 0);
jint* _bgra = env->GetIntArrayElements(bgra, 0);
Mat mdata(height, width, CV_8UC4, (unsigned char *)_p_data);
Mat mbgra(height, width, CV_8UC4, (unsigned char *)_bgra);
Mat tmp_mat= imdecode(mdata,1);
cvtColor(tmp_mat, mbgra, CV_RGB2RGBA);
env->ReleaseIntArrayElements(bgra, _bgra, 0);
env->ReleaseByteArrayElements(p_data, _p_data, 0);
}
Run Code Online (Sandbox Code Playgroud)