我正在开发一个应用程序,该应用程序通过JNI层从onPreviewFrame()回调中获取NV21缓冲区,然后在C++中使用OpenCV将其转换为RGB。以下是示例代码:
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));
但是,它不能显示正确的图像。有人知道我在这里错过了什么吗?
在位图配置中将Bitmap.Config.RGB_565
更改为Bitmap.Config.ARGB_8888
来自android开发者文档,
位图。配置RGB_565
每个像素存储在2个字节上,并且仅对RGB通道进行编码:红色存储精度为5位(32个可能值),绿色为以6位精度(64个可能值)存储蓝色具有5位精度。
此外,在您的本机函数调用中,使用COLOR_YUV2RGBA_NV21
保留一个4通道Mat.Convert。