在Qt中查看.raw文件
Qt中图像类为QImage,而OpenCV对图像操作使用Mat/IplImage,因此,想要在Qt的控件上查看.raw文件需要先将IplImage/Mat转换为QImage
笔者就是参考这个链接,稍加改动,将.raw文件显示到了QLabel中
代码如下:
void MainWindow::showImage()
{
//文件路径必须这样写,否则会报错
char *rawFileName = "D://QT//Work//testData//_1000_0_90//1.raw";
FILE *fp = NULL;
int ret = 0,width = 1440, height = 1080;
//为读取16bit raw数据分配空间
unsigned short *pRawData = (unsigned short *)calloc(width*height, sizeof(unsigned short));
fp=fopen(rawFileName, "rb");
ret = fread(pRawData,sizeof(unsigned short)*width*height,1, fp);
IplImage *pBayerData = cvCreateImage(cvSize(width,height), 16, 1);
IplImage *pRgbDataInt16 = cvCreateImage(cvSize(width,height),16,3);
IplImage *pRgbDataInt8 = cvCreateImage(cvSize(width,height),8,3);
memcpy(pBayerData->imageData, (char *)pRawData, width*height*sizeof(unsigned short));
cvCvtColor(pBayerData, pRgbDataInt16, COLOR_RGB2BGR);
//将16bit数据转换为8bit
cvConvertScale(pRgbDataInt16, pRgbDataInt8, 0.015625, 0);
QImage image(Ipl_to_QImage(pRgbDataInt8));
QPixmap pixmap = QPixmap::fromImage(image);
ui->lab_picture->setPixmap(pixmap);
}
QImage MainWindow::Ipl_to_QImage(const IplImage *iplImg)
{
int w = iplImg->width;
int h = iplImg->height;
QImage qImage(w, h, QImage::Format_RGB32);
int x, y;
for(x = 0; x < iplImg->width; ++x)
{
for(y = 0; y < iplImg->height; ++y)
{
CvScalar color = cvGet2D(iplImg, y, x);
int r = color.val[2];
int g = color.val[1];
int b = color.val[0];
qImage.setPixel(x, y, qRgb(r,g,b));
}
}
return qImage;
}