国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android將camera獲取到的YuvData在jni中轉化為Mat方法

2019-10-21 21:42:48
字體:
來源:轉載
供稿:網友

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*heightU = Y/4v = Y/4

所以獲取灰度圖只需要Y的數據大小就可以,所以構造函數中寬高都是圖像的寬高,而要獲取YUV彩色圖像則需要獲取的內存長度為width*height*3/2

Android,camera,YuvData,jni,Mat

Android,camera,YuvData,jni,Mat

構造函數中圖像高度需再加上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/2	Mat 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方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 大余县| 历史| 临颍县| 景泰县| 蕲春县| 华容县| 万安县| 道真| 天峻县| 开江县| 冕宁县| 涿鹿县| 定州市| 瓦房店市| 独山县| 香港 | 曲麻莱县| 离岛区| 都安| 新昌县| 洪江市| 酉阳| 偃师市| 德州市| 饶阳县| 阜城县| 靖边县| 台山市| 沽源县| 特克斯县| 聂拉木县| 海原县| 安泽县| 安化县| 株洲县| 尼玛县| 江陵县| 大连市| 花莲县| 焦作市| 彭泽县|