最近在android上使用cv做一些简单的图像处理,摄像头拍摄的照片是JPEG格式的,cv处理时会解码成bmp。3个选择:
1、图片保存在sdcard上,JNI再去读取文件。 最后的万不得以到办法。
2、图片在java层解码,再通过JNI传输给C++。图片分辨率为3264x2448,解出来的bmp图片大小为32M,放弃。
3、JNI传输jpeg buffer 给C++。 jpeg buffer只有2M左右,但是需要解决 解码内存jpeg图片的问题。
通过jni传下来的jpeg buffer,libjpeg竟然不支持,jpeg只支持文件系统上的文件输入。网上有人说turbo-jpeg可以, 编译链接以后,在手机上运行崩溃,找不到原因。
偶然间在在cv的头文件上看到 imdecode这个函数:
CV_EXPORTS_W Mat imdecode(InputArray buf,int flags);
遇到一个问题:
输入是 InputArray类型的,而存放JPEG数据的却是c++指针。
度娘告诉我,Mat继承自InputArray,把jpeg数据传给Mat,然后调用imdecode对解码Mat进行解码。
完整代码如下:
jint length = env->GetArrayLength(byteArray); //取得jni buffer size。
cv::Mat standimg1 = Mat(length,1,CV_8UC1); Mat 分配空间
env->GetByteArrayRegion(byteArray,0,len,(jbyte *)(standimg1.data)); //Mat。data 即Mat存放数据的地址。
Mat standimg = imdecode( standimg1, CV_LOAD_IMAGE_COLOR); 解码
if(standimg.empty()){
LOGD("read image err. \n");
return -1;
}
LOGFI("%d %d ",standimg.rows,standimg.cols);