发现的IplImage转QImage的好用的方式

今日发现一个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);

猜你喜欢

转载自blog.csdn.net/weixin_44650358/article/details/125003939