今日发现一个IplImage 转换为 QImage好用的方式,担心失效便记录一下并添加了自己的内容。
亲测有效。
IplImage 转换为 QImage
QImage *IplImageToQImage(IplImage *img)
{
QImage *qmg;
cvCvtColor(img,img,CV_BGR2RGB);
qmg = new QImage((unsigned char*)img->imageData,img->width,img->height,img->widthStep,QImage::Format_RGB888);
return qmg;
}
这里要注意的是,OpenCV的IplImage和Mat每个像素点存储的格式为BGR,而QImage每个像素点存储的格式为RGB,所以在转换之前需要先使用opencv提供的cvCvtColor函数将BGR图像变为RGB图像。还有就是QImage最后一个参数QImage::Format_RGB888,这是指色彩空间R,G,B三个通道分别用8位来表示,如果是灰度图,则参数为QImage::Format_Indexed8。
例如:
QImage *IplImageToQImage(IplImage *img)
{
QImage *qmg;
IplImage *img_gray = cvCreateImage(cvGetSize(img),8,1);
cvCvtColor(img,img_gray,CV_BGR2GRAY);
qmg = new QImage((unsigned char*)img->imageData,img->width,img->height,img->widthStep,QImage::Format_Indexed8);
return qmg;
}
同理的,Mat转QImage如下:
QImage* MatToQImage(Mat *img)
{
QImage *qmg;
cvtColor(*img,*img,CV_BGR2RGB);
qmg = new QImage((unsigned char*)img->data,img->cols,img->rows,img->step,QImage::Format_RGB888);
return qmg;
}
Mat转IplImage如下:
//深拷贝
Mat mat_Image = imshow("1.bmp");
IplImage image = cvIplImage(mat_Image);
IplImage* temp;
//temp = cvCreateImage(cvSize(mat_Image.rows, mat_Image.cols), 8, 1);//灰度图
temp = cvCloneImage(&image);
另外,再附上一个在Qt上显示QImage的代码:
图片随着QLabel的大小而自适应
IplImage* image= CvLoadImage("path/myimage.jpg");
QImage *q_Image = new QImage(image->width,image->height,QImage::Format_RGB888);
q_Image = IplImageToQImage(image);
QImage imageScale = q_Image->scaled(QSize(ui->label->width(),
ui->label->height()));
QPixmap pixmap = QPixmap::fromImage(imageScale);
ui->label->setPixmap(pixmap);
顺便记录显示一下用窗口显示 IplImage
IplImage* image= CvLoadImage("path/myimage.jpg");
cvNamedWindow("img", 0);//参数0代表窗口大小可修改,如果是1代表自适应且大小不可更改
cvResizeWindow("img", 400, 300);
cvMoveWindow("img", 300, 300);
cvShowImage("img", image);
cvWaitKey(0);