2014-04-17 38 views
0

我正在研究一個應用程序,該應用程序通過JNI層從onPreviewFrame()回調中獲取NV21緩衝區,然後使用C++中的OpenCV將其轉換爲RGB。下面是示例代碼:Opencv/C++ - 將NV21轉換爲RGB並在android應用程序中生成位圖

Mat yuv(height+height/2, width, CV_8UC1, inBuffer); 
Mat rgb(height, width, CV_8UC3); 
cvtColor(yuv, rgb, COLOR_YUV2RGB_NV21); 

現在在Android應用程序,我得到的RGB緩衝區回來,並嘗試通過產生從它的位圖來顯示它:

Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); 
bitmap.createPixelsFromBuffer(ByteBuffer.wrap(imageBuffer)); 

但是,它不顯示適當的圖像。有沒有人知道我在這裏錯過了什麼?

回答

2

在您的位圖的配置改變Bitmap.Config.RGB_565Bitmap.Config.ARGB_8888

從Android顯影劑文檔,

Bitmap.Config RGB_565

每個像素存儲在2個字節,並且只有RGB通道的編碼: 紅色以5位精度(32個可能值)存儲,綠色爲 ,存儲有6位精度(64個可能值)藍色存儲 5位精度。

此外,在你的本地函數調用保持4通道墊。換成COLOR_YUV2RGBA_NV21

+0

一個跟進問題。是否可以使用Opencv旋轉NV21圖像?我使用Mat yuv(height + height/2,width,CV_8UC1,inBuffer)生成Mat。但是,當我旋轉它時,生成的圖像部分被一些純白色所覆蓋。之所以我試圖獲得上面的RGB圖像,因爲我最終需要旋轉它,因爲我能夠很好地使用opencv較早地旋轉RGB圖像。 – pree

+0

您可以旋轉YUV圖像,但會產生很大的錯誤。由於RGB值取決於YUV像素的位置。所以現在你的圖像會有'rows = width'和'cols = 1.5 * height'。所以RGB圖像將具有'行數= 0.66 *寬度'和'列數= 1.5 *高度'。如果你想旋轉輸出,你可以用Java旋轉位圖,或者旋轉RGB Mat。如果您正在旋轉RGB Mat,請確保您使用適當的值創建位圖。 – Froyo

+0

所以我寧願將NV21/YUV轉換爲RGBA_8888,就像您在回覆中提到的那樣,然後旋轉以避免錯誤的旋轉圖像,對不對? – pree

相關問題