我正在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();
然后我将此字节数组发送到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);
但是返回的位图就像是噪音。
这是我的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);
}
可能,我犯了错误的转换类型。因为我无法找到有关转换字节后可绘制多少通道的任何信息。我正在等待你的帮助来解决我的问题。
提前致谢。
答案 0 :(得分:6)
我解决了我的问题。如果有人面临同样的问题,他们可以解决这样的问题;
问题在于我的代码的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);
}