Android将camera获取到的YuvData在jni中转化为Mat
来源:互联网 发布:淘宝服装推广方案 编辑:程序博客网 时间:2024/05/17 21:30
Android中可以通过camera获取图像,并实时处理,不同的手机camera支持的的图像格式不同,可以采用getCameraPreviewFormat来得到preview支持的图像编码格式,Android默认使用NV21(yuv420sp)的图像格式,因为大部分手机都支持。
为了达到实时处理的目的,很多时候我们将得到的yuv数据直接传入jni中的c++使用,减少上层转化图像格式的过程yuv420本身属于单通道图像,若图像处理中只需要获取灰度图像,可以在c++中直接通过Mat构造函数构造生成灰度图像,代码如下:
/** ImageProcessing.cpp* 实时显示canny算子结果*/#include <jni.h>#include <opencv2/core/core.hpp>#include <opencv2/imgproc/imgproc_c.h>#include <opencv2/opencv.hpp>using namespace std;using namespace cv;Mat * mCanny = NULL;extern "C"jbooleanJava_my_project_MyRealTimeImageProcessing_CameraPreview_ImageProcessing(JNIEnv* env, jobject thiz,jint width, jint height,jbyteArray NV21FrameData, jintArray outPixels){jbyte * pNV21FrameData = env->GetByteArrayElements(NV21FrameData, 0); //输入yuv数据 jint * poutPixels = env->GetIntArrayElements(outPixels, 0);//输出结果的int数据if ( mCanny == NULL ){mCanny = new Mat(height, width, CV_8UC1);}Mat mGray(height, width, CV_8UC1, (unsigned char *)pNV21FrameData);//构建灰度图时构造函数Mat mResult(height, width, CV_8UC4, (unsigned char *)poutPixels);IplImage srcImg = mGray;IplImage CannyImg = *mCanny;IplImage ResultImg = mResult;cvCanny(&srcImg, &CannyImg, 80, 100, 3);cvCvtColor(&CannyImg, &ResultImg, CV_GRAY2BGRA);env->ReleaseByteArrayElements(NV21FrameData, pNV21FrameData, 0);env->ReleaseIntArrayElements(outPixels, poutPixels, 0);return true;}
若图像处理时需要彩色图像,则需要先将nv21类型的数据转化为yuv格式,再将yuv转化为BGR彩色图像,构造yuv时的构造函数和直接构造灰度图有些不同,在YUV420中一个像素对应一个Y,一个2*2的小方块对应一个UV,对于所有YUV420图像,它们的Y值排列是完全相同的,因为只有Y的图像就是灰度图像。YUV420sp与YUV420p的数据格式它们的UV排列在原理上是完全不同的。420p它是先把U存放完后,再存放V,也就是说UV它们是连续的。而420sp它是UV、UV这样交替存放的。对于一个YUV420在内存中存放的大小:
Y = width*height
U = Y/4
v = Y/4
所以获取灰度图只需要Y的数据大小就可以,所以构造函数中宽高都是图像的宽高,而要获取YUV彩色图像则需要获取的内存长度为width*height*3/2
YUV420sp格式如下图 YUV420p数据格式如下图
构造函数中图像高度需再加上1/2*height,代码如下:
JNIEXPORT int JNICALL Java_com_ProjectName_nativecaller_ClassName_readYUV420SP(JNIEnv *env, jclass clz, jbyteArray yuv,jint len,jint height,jint width){jbyte * pBuf = (jbyte*)env->GetByteArrayElements(yuv, 0);Mat image(height + height/2,width,CV_8UC1,(unsigned char *)pBuf);//注意这里是height+height/2Mat mBgr;cvtColor(image, mBgr, CV_YUV2BGR_NV21);imwrite("/mnt/sdcard/readYuv.jpg",mBgr);env->ReleaseByteArrayElements(yuv, pBuf, 0); return 0;}
- Android将camera获取到的YuvData在jni中转化为Mat
- sass中转化为px转化为rem的使用
- 将Opencv java中的Mat通过jni传递到C++中的方法
- 将Android的Camera源码导入到eclipse中进行开发
- android Camera摄像头-Surface view 预览拍照 并将拍的照片插入到系统图库
- Android上使用camera拍照,把获取的照片上传到远程服务器
- Android上使用camera拍照,把获取的照片上传到远程服务器
- Android上使用camera拍照,把获取的照片上传到远程服务器
- Android上使用camera拍照,把获取的照片上传到远程服务器
- Android上使用camera拍照,把获取的照片上传到远程服务器
- Android 2.1 中 JNI 层 camera 的应用
- Android 2.1 中 JNI 层 camera 的应用
- 将matlab 生成的mat矩阵存储到txt中。
- 将传统的照片在Autodesk® 123D™ Catch中转换成3D模型
- Android获取Camera支持的分辨率
- 在Action中转到其它url的三种方法对比。
- android 获取camera状态?
- android 获取camera状态?
- Windows如何搭建PHP开发环境?
- java 使用redis
- 1.uC/OS III 内核, 你应该知道的东西
- 感知机
- C#中out和ref之间的区别
- Android将camera获取到的YuvData在jni中转化为Mat
- basemap构建地图
- protobuf
- 每日一题——判断二叉树是否平衡,求一棵二叉树的镜像
- 方法内部类
- 小结 | 函数的调用过程(栈帧)
- 安卓工作室android studio 美化 ,设置背景图片。
- Hdu6098 Inversion(2017多校第6场)
- spring mvc基础篇(十二):综合案例一