91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-10-03 18:34:44 來源:腳本之家 閱讀:507 作者:BrcLi 欄目:移動開發

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"
jboolean
Java_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

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方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

平南县| 楚雄市| 靖边县| 惠州市| 贵州省| 定日县| 金山区| 大冶市| 利川市| 龙口市| 嘉荫县| 大名县| 红原县| 临海市| 年辖:市辖区| 平阴县| 丰宁| 龙井市| 桓台县| 湘阴县| 禹州市| 铜山县| 武平县| 云和县| 襄汾县| 中卫市| 竹山县| 西盟| 洪江市| 桐乡市| 凤阳县| 九龙城区| 海口市| 溧阳市| 沅陵县| 门源| 罗定市| 卢湾区| 宣汉县| 南涧| 内丘县|