NDK 读文件 和Mat Bitmap 转化android studio 2.1

NDK 读文件 和Mat Bitmap 转化android studio 2.1

盖天地不全,这经原是全全的,今沾破了, 乃是应不全之奥妙也,岂人力 所能与耶! 愿来者补充
上回说到怎么调用C++代码。
今天说一下,怎么读取文件。和Mat bitmap类型问题。。

读取文件

我建议是使用android的sd卡,进行传。可以直接读的在C++代码中使用
FILE *fb = fopen("/mnt/sdcard/xx.txt", "rb");  

还有就是通过缓冲区进行读,这个我没有弄过。。
还有一个就要通过读取asset文件夹中的数据,这个我尝试了,但是不支持AssertManager这个类型,就没有弄了

Mat Bitmap类型转换问题

在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类型进行处理。。,并返回处理结果。

你可能感兴趣的:(NDK-AS)