我正在开发Android应用程序,并且想要将摄像头预览回调中的字节数组,该数组是以YUV格式表示的,转换为RGB格式。
我已经使用了这个答案提供的函数:在Android上获取视频图像帧
它在Java中运行得非常完美,但我的问题是我想要在C++中实现此函数(我正在使用NDK,并不太熟悉C++)。
我已经尝试在C++中创建这个函数,但它总是产生奇怪的结果(例如,图片全部都是绿色的)。
有没有人拥有类似的函数或者这个函数在C++中能够正常运行?
谢谢。
我已经使用了这个答案提供的函数:在Android上获取视频图像帧
它在Java中运行得非常完美,但我的问题是我想要在C++中实现此函数(我正在使用NDK,并不太熟悉C++)。
我已经尝试在C++中创建这个函数,但它总是产生奇怪的结果(例如,图片全部都是绿色的)。
有没有人拥有类似的函数或者这个函数在C++中能够正常运行?
谢谢。
C++中从YUYV到RGB的转换:
unsigned char* rgb_image = new unsigned char[width * height * 3]; //width and height of the image to be converted
int y;
int cr;
int cb;
double r;
double g;
double b;
for (int i = 0, j = 0; i < width * height * 3; i+=6 j+=4) {
//first pixel
y = yuyv_image[j];
cb = yuyv_image[j+1];
cr = yuyv_image[j+3];
r = y + (1.4065 * (cr - 128));
g = y - (0.3455 * (cb - 128)) - (0.7169 * (cr - 128));
b = y + (1.7790 * (cb - 128));
//This prevents colour distortions in your rgb image
if (r < 0) r = 0;
else if (r > 255) r = 255;
if (g < 0) g = 0;
else if (g > 255) g = 255;
if (b < 0) b = 0;
else if (b > 255) b = 255;
rgb_image[i] = (unsigned char)r;
rgb_image[i+1] = (unsigned char)g;
rgb_image[i+2] = (unsigned char)b;
//second pixel
y = yuyv_image[j+2];
cb = yuyv_image[j+1];
cr = yuyv_image[j+3];
r = y + (1.4065 * (cr - 128));
g = y - (0.3455 * (cb - 128)) - (0.7169 * (cr - 128));
b = y + (1.7790 * (cb - 128));
if (r < 0) r = 0;
else if (r > 255) r = 255;
if (g < 0) g = 0;
else if (g > 255) g = 255;
if (b < 0) b = 0;
else if (b > 255) b = 255;
rgb_image[i+3] = (unsigned char)r;
rgb_image[i+4] = (unsigned char)g;
rgb_image[i+5] = (unsigned char)b;
}
y = max(min(y, 235), 16); Cb = max(min(y, 240), 16); Cr = max(min(y, 240), 16);
- Rotemrgb_image[+1]
这样的问题。 - Force Gaia