本次主要记录QT以及QML显示UVC摄像头采集图像以及期间可靠性崩溃和刷新频率问题
在开发UVC摄像头过程中,开始直接将图像显示在FrameBuffer上面,该方式很多猿兄已经写过了方式方法,大家搜一下就可以看到,具体不展开细说。
该方式如果和触摸屏同步使用,打开相机后显示图像会和桌面程序抢占最上层界面进行显示,此种情况下就多了在QT或者QML上直接显示图像。
此时程序设计发生变化如下:
显然,将UVC摄像头采集到的图像数据显示在QML上,考虑到QT自带QImage就是处理图像的模块,自然该需求变化未QML显示QImage的需求。同样有很多大佬写了关于QML如何显示QImage的案例,典型的方式是重写QQuickImageProvider给QML提供QImage。该方式大家搜一下,有很多实现方式,就不多说。
这里说一下转换过程,由于UVC摄像头采集到的原始图像数据为YUV数据,如何转至RGB格式进行显示。
YUV422数据格式:大致为每一组Y分量用一组UV分量,由此可以算出每一个像素占用字节数为:1(Y)+1/2(U)+1/2(V)=2bytes,所以计算大小时图像单帧字节数为:ImgWidth*ImgHeight*2,大致可以理解为每一个Y分量公用两个UV分量,其中YUYV大致排布如下图。
根据YUV转换成RGB模型有如下公式:
R = 1.164*(Y-16) + 1.159*(V-128);
G = 1.164*(Y-16) - 0.380*(U-128)+ 0.813*(V-128);
B = 1.164*(Y-16) + 2.018*(U-128));
则可以设计YUV转换成RGB转换函数,由于YUV模型为YUV422(YUYV)模型,这里根据转换模型计算出的RGB分量需要两次分发,保证每一组Y分量公用UV分量。具体函数如下:
int yuv2rgb(int y, int u, int v)
{
unsigned int pixel32 = 0;
unsigned char *pixel = (unsigned char *)&pixel32;
int r, g, b;
static long int