盖天地不全,这经原是全全的,今沾破了, 乃是应不全之奥妙也,岂人力 所能与耶! 愿来者补充
上回说到怎么调用C++代码。
今天说一下,怎么读取文件。和Mat bitmap类型问题。。
我建议是使用android的sd卡,进行传。可以直接读的在C++代码中使用
FILE *fb = fopen("/mnt/sdcard/xx.txt", "rb");
还有就是通过缓冲区进行读,这个我没有弄过。。
还有一个就要通过读取asset文件夹中的数据,这个我尝试了,但是不支持AssertManager这个类型,就没有弄了
在JAVA中使用Bitmap类型来读文件,但在C++代码中要使用OpenCV库中Mat类型的数据,这就需要转换。。
Bitmap bitmap= BitmapFactory.decodeResource(getResources(),R.drawable.img2); ;
int w = bitmap.getWidth();
int h = bitmap.getHeight();
int[] pix = new int[w * h];
bitmap.getPixels(pix, 0, w, 0, 0, w, h);
这样就可以读取资源文件中的图像,并转为bitmap类型,将bitmap类型通过NDK传到C++存在问题,我就使用int数组来进行传递,之前使用byte数组传老是出错,后来发现我可能是byte的范围不够,在java中没有无符号的数据。
JNIEXPORT jintArray JNICALL Java_com_cij_face_faceDetectHelp_gray(JNIEnv *env,jclass obj,jintArray buf,int w,int h)
{
//读取int数组并转为Mat类型
jint *cbuf;
cbuf = env->GetIntArrayElements(buf,JNI_FALSE);
if (NULL == cbuf)
{
return 0;
}
Mat imgData(h,w,CV_8UC4,(unsigned char*) cbuf);
//...这里写对Mat的操作就可以了
//这里传回int数组。
int size = w * h;
jintArray result = env->NewIntArray(size);
env->SetIntArrayRegion(result,0,size,cbuf);
env->ReleaseIntArrayElements(buf,cbuf,0);
return result;
}
//最后将返回的int数组转为bitmap类型。
Bitmap resultface=Bitmap.createBitmap(w,h,Bitmap.Config.RGB_565);
//faceall为返回的int数组
resultface.setPixels(faceall,0,w,0,0,w,h);
这样就完成了,从java中读取图片,在c++代码中使用opencv中Mat类型进行处理。。,并返回处理结果。