Android将相机获取到的YuvData在jni中转化为垫方法

  

Android中可以通过相机获取图像,并实时处理,不同的手机相机支持的的图像格式不同,可以采用getCameraPreviewFormat来得到预览支持的图像编码格式,Android默认使用NV21 (yuv420sp)的图像格式,因为大部分手机都支持。

  

为了达到实时处理的目的,很多时候我们将得到的yuv数据直接传入jni中c++的使用,减少上层转化图像格式的过程yuv420本身属于单通道图像,若图像处理中只需要获取灰度图像,可以在c++中直接通过垫构造函数构造生成灰度图像,代码如下:

     /*   * ImageProcessing.cpp   *实时显示精明的算子结果   */# include & lt; jni.h>      # include & lt; opencv2/核心/core.hpp>   # include & lt; opencv2/imgproc/imgproc_c.h>   # include & lt; opencv2/opencv.hpp>         使用名称空间性病;   使用名称空间的简历;         垫* mCanny=零;      外来的“C”   jboolean   Java_my_project_MyRealTimeImageProcessing_CameraPreview_ImageProcessing (   JNIEnv * env, jobject thiz,   jint宽度,jint高度,   jbyteArray NV21FrameData, jintArray outPixels)   {   jbyte * pNV21FrameData=https://www.yisu.com/zixun/env-> GetByteArrayElements (NV21FrameData 0);//输入yuv数据   jint * poutPixels=env -> GetIntArrayElements (outPixels 0);//输出结果的int数据   如果(mCanny==NULL)   {   mCanny=new垫(高度、宽度、CV_8UC1);   }   垫mGray(高度、宽度、CV_8UC1 (unsigned char *) pNV21FrameData);//构建灰度图时构造函数   垫mResult(高度、宽度、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);   返回true;   }   之前      

若图像处理时需要彩色图像,则需要先将nv21类型的数据转化为yuv格式,再将yuv转化为BGR彩色图像,构造yuv时的构造函数和直接构造灰度图有些不同,在YUV420中一个像素对应一个Y,一个2 * 2的小方块对应一个紫外线,对于所有YUV420图像,它们的Y值排列是完全相同的,因为只有Y的图像就是灰度图像.YUV420sp与YUV420p的数据格式它们的紫外线排列在原理上是完全不同的.420p它是先把你存放完后,再存放V,也就是说紫外线它们是连续的。而420 sp它是紫外线,紫外线这样交替存放的。对于一个YUV420在内存中存放的大小:

        Y=宽*高      U=Y/4      v=Y/4   之前      

所以获取灰度图只需要Y的数据大小就可以,所以构造函数中宽高都是图像的宽高,而要获取YUV彩色图像则需要获取的内存长度为宽*高* 3/2

  

 Android将相机获取到的YuvData在jni中转化为垫方法

  

 Android将相机获取到的YuvData在jni中转化为垫方法

  

<>强构造函数中图像高度需再加上1/2 *高度,代码如下:

        JNIEXPORT int JNICALL Java_com_ProjectName_nativecaller_ClassName_readYUV420SP (JNIEnv * env, jclass clz, jbyteArray yuv, jint len, jint高度,jint宽度)   {      jbyte * pBuf=(jbyte *) env→GetByteArrayElements (yuv 0);      垫图像(高度+/2高度,宽度,CV_8UC1 (unsigned char *) pBuf);//注意这里是高度+高度/2   垫mBgr;   cvtColor(图像、mBgr CV_YUV2BGR_NV21);   imwrite (“/mnt/sdcard/readYuv.jpg”, mBgr);   env→ReleaseByteArrayElements (yuv pBuf 0);   返回0;   }   之前      

以上这篇Android将相机获取到的YuvData在jni中转化为垫方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

Android将相机获取到的YuvData在jni中转化为垫方法