准备条件:ARM-A8通过V4l2连接USB摄像头,并通过初始化及相关工作(这写在以后回来记录)

项目进展:在通过USB摄像头经过read_frame()之后得到的图片数据是YUY2格式的,通常USB摄像头都是YUY2(也可以说是YUYV)的,之后我的项目需要在QT上显示,以确保之后的使用openCV进行人脸识别。

问题:现在遇到的问题是:需要把YUY2格式的buffer中的数据转化位RGB24的格式的图片,并进行显示在Label上,如何解决?

处理过程:

算法:其实我就是用了一个公式(见图片),其实这个公式一查就能查到。

       

opencv rgb yuv互转 opencv yuv2rgb_YUY2YUYV转RGB

那么可能有人要问了,为什么是R0G0B0 R1G1B1,这个就和YUY2本身格式相关有关了,大家自己去查YUY2基本格式就能了解到。这里就不过多赘述了哈。

数据格式:过程当中使用QT的各种格式转化比较麻烦点,但是可以确保没有问题,这是重点呀!(见代码)基本上我使用的都是UCHAR。所以比较通过。

以下是核心代码:


unsigned char *MainWindow::yuyv_2_rgb(unsigned char *YUY2buff, int count) //count是YUY2buff的字节数目
{
    qDebug()<<"开始转换......";
    int dwSize = count;
output.clear();
    for(int i=0;i<dwSize;i+=4)
    {
        qDebug()<< "count: " << i;
        unsigned char Y0 = *YUY2buff;        //qDebug()<<"Y0: " <<Y0;
        unsigned char U  = *(++YUY2buff);    //qDebug()<<"U:  " <<U;
        unsigned char Y1 = *(++YUY2buff);    //qDebug()<<"Y1: " <<Y1;
        unsigned char V  = *(++YUY2buff);    //qDebug()<<"V:  " <<V;
        ++YUY2buff;
        // RGB第一个像素点
// QByteArray output,用QByteArray是出于格式处理的方便,而且也很方便转为uchar*
output.append(judge((char)(Y0 + 1.370705 * (V-128))));
        output.append(judge((char)(Y0 - (0.698001 * (V-128)) - (0.337633 * (U-128)))));
        output.append(judge((char)(Y0 + (1.732446 * (U-128)))));
        // RGB第二个像素点
        output.append(judge((char)(Y1 + (1.370705 * (V-128)))));
        output.append(judge((char)(Y1 - (0.698001 * (V-128)) - (0.337633 * (U-128)))));
        output.append(judge((char)(Y1 + (1.732446 * (U-128)))));
    }
    qDebug()<<"转换完成......";
    unsigned char *c = (unsigned char *)output.data();
    return c;

}
//这里是数值大于255或小于0的方法,很简单
unsigned char MainWindow::judge(unsigned char num)
{
    if(num<0)
        return 0;
    else if(num>255)
        return 255;
    else
        return num;
}

结果:在经过很多资料的查找之后,贴上代码,效果成功,关于效率的问题,查了比较多资料,很多都是这样来写的。我整了一天,才最终完成,贴上代码和效果图。r如下是效果。

处理前(YUY2格式):(Note:关于yuy格式图片,网上有的工具说的是能打开,但实际打不开,可以找到一款软件,下有截图,大家可以自行下载,如果找不到,可以私信我)

opencv rgb yuv互转 opencv yuv2rgb_opencv rgb yuv互转_02

处理后格式(.bmp):(可以看到总体是没问题的,但是有些边缘有些小问题的)

opencv rgb yuv互转 opencv yuv2rgb_QT_03