发现的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);
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]和\[3\]中的代码展示了使用OpenCV库中的函数来旋图像。在这些代码中,首先加载源图像,然后创建一个空的目标图像。接下来,指定旋中心和旋角度,并创建一个旋矩阵。然后,使用cvWarpAffine函数将源图像与旋矩阵进行卷积,得到旋后的图像。最后,显示源图像和旋后的图像,并等待用户按下任意键。最后,释放图像和矩阵的内存空间。 如果你想要旋彩色图像,可以参考引用\[3\]中的代码。这段代码使用了一个嵌套的循环来遍历图像的每个像素,并进行交换操作来实现旋。具体来说,对于每个像素,计算旋后的坐标,并将原始像素值与旋后的像素值进行交换。最后,更新图像的宽度和高度,并显示旋后的图像。 需要注意的是,这些代码只是示例,你可以根据自己的需求进行修改和优化。同时,确保你已经正确安装了OpenCV库,并在代码中包含了正确的头文件。 希望这些信息对你有帮助!\[1\]\[3\] #### 引用[.reference_title] - *1* [OpenCV 如何实现图像旋](https://blog.csdn.net/qq_30460949/article/details/89679942)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [图像旋c++实现](https://blog.csdn.net/wfei101/article/details/73555888)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [图像翻正以及原地(不开辟新空间)顺时旋90度问题](https://blog.csdn.net/u011463646/article/details/78165583)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值