我正在尝试使用 V4L2 API 来捕获图像并将图像放入 opencv Mat 中。问题是我的网络摄像头只在 YUYV (YUY2) 中捕获,所以我需要先转换为 RGB24。这是我正在使用的完整 V4L2代码。
我能够让图片中的物体变得可识别,但它都是粉红色和绿色的,而且它被水平拉伸和扭曲。我尝试了许多不同的转换公式,并且得到了相同的基本粉色/绿色失真图像。这张图片使用的公式来自http://paulbourke.net/dataformats/yuv/。我正在使用 linux 上的 shotwell 照片查看器来查看 .raw 图像。我无法打开它。我对如何保存图像格式不是很了解,但我假设必须有某种标题,但 shotwell 照片查看器似乎可以工作。这可能是图像不正确的原因吗?
我不确定 V4l2 是否返回 p 指向的有符号或无符号字节图像。但如果这是问题,我的图像不会只是颜色变差吗?但似乎几何图形也被扭曲了。我相信我正确地处理了浮点数的转换。
有人可以帮我理解吗
- 如何找出 *void p 变量中包含的基础类型
- 从 YUYV 转换为 RGB24 的正确公式,包括使用哪种类型的说明
- 保存没有格式(标题)的图像并使用 Shotwell 查看会是问题吗?
- 有没有一种简单的方法可以正确保存 RGB24 图像。
- 一般调试提示
谢谢
static unsigned char *bgr_image;
static void process_image(void *p, int size)
{
frame_number++;
char filename[15];
sprintf(filename, "frame-%d.raw", frame_number);
FILE *fp=fopen(filename,"wb");
int i;
float y1, y2, u, v;
char * bgr_p = bgr_image;
unsigned char * p_tmp = (unsigned char *) p;
for (i=0; i < size; i+=4) {
y1 = p_tmp[i];
u = p_tmp[i+1];
y2 = p_tmp[i+2];
v = p_tmp[i+3];
bgr_p[0] = (y1 + 1.371*(u - 128.0));
bgr_p[1] = (y1 - 0.698*(u - 128.0) - 0.336*(v - 128.0));
bgr_p[2] = (y1 + 1.732*(v - 128.0));
bgr_p[3] = (y2 + 1.371*(v - 128.0));
bgr_p[4] = (y2 - 0.698*(v - 128.0) - 0.336*(u - 128.0));
bgr_p[5] = (y2 + 1.732*(u - 128.0));
bgr_p+=6;
}
fwrite(bgr_image, size, 1, fp);
fflush(fp);
fclose(fp);
}