项目原因,需要将GPU加速后输出的float格式图像在QT界面上显示,所以不能直接用Opencv中的CV_32FC1来显示。
目前版本QImage支持的图像格式如下图:
因此,选用QImage中的Format_Grayscale16格式来显示cuda运算后输出的float格式图像,将float格式转成ushort格式。
前提and原理:
从表格中可以看出,float格式的取值范围为(-1~1)或(0~1),unit 16的取值范围是(0~65535)。在GPU加速中,对原始图像做了归一化处理,将图像像素值归一化到(0~1)之间,得到了float图像,因此,只需要将输出的float格式图像对应的像素值还原到所用格式的取值范围即可正常显示图像。
关键代码:
1 //QImage显示
2 //QImage img;
3 //32float转ushort
4 img = QImage(xsize * 2, ysize * 2, QImage::Format_Grayscale16);
5 pDst = (ushort*)img.bits();
6
7 for (int i = 0; i < xsize * 2; i++)
8 {
9 for (int j = 0; j < ysize * 2; j++)
10 {
11 *(pDst) = (ushort)((Img_show_final[i * xsize * 2 + j]) * 65535 );
12 pDst++;
13 }
14 }
15
16 return img;
经测试,QImage::Format_Grayscale16与cv::CV_32FC1显示效果一样。