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));
但是,它不顯示適當的圖像。有沒有人知道我在這裏錯過了什麼?
一個跟進問題。是否可以使用Opencv旋轉NV21圖像?我使用Mat yuv(height + height/2,width,CV_8UC1,inBuffer)生成Mat。但是,當我旋轉它時,生成的圖像部分被一些純白色所覆蓋。之所以我試圖獲得上面的RGB圖像,因爲我最終需要旋轉它,因爲我能夠很好地使用opencv較早地旋轉RGB圖像。 – pree
您可以旋轉YUV圖像,但會產生很大的錯誤。由於RGB值取決於YUV像素的位置。所以現在你的圖像會有'rows = width'和'cols = 1.5 * height'。所以RGB圖像將具有'行數= 0.66 *寬度'和'列數= 1.5 *高度'。如果你想旋轉輸出,你可以用Java旋轉位圖,或者旋轉RGB Mat。如果您正在旋轉RGB Mat,請確保您使用適當的值創建位圖。 – Froyo
所以我寧願將NV21/YUV轉換爲RGBA_8888,就像您在回覆中提到的那樣,然後旋轉以避免錯誤的旋轉圖像,對不對? – pree