【opencv学习之三】opencv与qt图像格式交换调试问题和补充(IplImage-->QImage)

本文介绍如何在Opencv处理图像后将其正确转换为Qt可显示的格式,特别是针对灰度图像的处理流程。文中提供了具体的C++代码实现,包括创建Qt窗口、加载图像、进行灰度转换以及在Qt界面上显示图像的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         opencv与qt联合编程时候,需要将opencv的图片传给qt使得其能在qt的UI里显示出来并操作是,上一节已经说过了,不过如果是彩色3通道的可以直接显示,没有什么问题,但是opencv处理后再传给qt就会出现图片乱码的,寻找解决办法如下:

#include "form.h"
#include "ui_form.h"
#include "cv.h"
#include "highgui.h"
#include <QPalette>
#include <QWidget>
#include <QMessageBox>
#define RGB_TYPE 3              //R,G,B三通道
#define GRAY_TYPE 1             //格雷图,单通道

Form::Form(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Form)
{
    ui->setupUi(this);
    this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowMinimizeButtonHint);
    this->setAttribute(Qt::WA_TranslucentBackground);//设置背景透明
    
    // 从文件中加载原图
   IplImage* pImg = cvLoadImage("D:/22.jpg", CV_LOAD_IMAGE_UNCHANGED);
    // 灰度图
    IplImage *pGrayImage =  cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);
    cvCvtColor(pImg, pGrayImage, CV_BGR2GRAY);

   // QImage img;
     int nChannel=pGrayImage->nChannels;
     if(nChannel)
         {
     QMessageBox msgBox;
     msgBox.setText(QString::number(nChannel));
     msgBox.exec();
        }

     IplImage*pImg2=cvCreateImage(cvGetSize(pGrayImage),8,3);
     cvCvtColor(pGrayImage,pImg2,CV_GRAY2BGR );

     int nChannel2=pImg2->nChannels;
     if(nChannel2)
         {
     QMessageBox msgBox;
     msgBox.setText(QString::number(nChannel2));
     msgBox.exec();
        }

        //qt与opencv图像交换
        IplImage *srcImage;          //原图
        srcImage=pGrayImage;

        int width;
        int height;
        int channel_1;                 //图像通道数
        
     width=srcImage->width;
     height=srcImage->height;
     channel_1=srcImage->nChannels;

     QImage desImage=QImage(width,height,QImage::Format_RGB32);
         for(int i=0;i<height;i++)
         {
             for(int j=0;j<width;j++)
             {
                 int r,g,b;
                 if(RGB_TYPE==channel_1)
                 {
                     b=(int)CV_IMAGE_ELEM(srcImage,uchar,i,j*3+0);
                     g=(int)CV_IMAGE_ELEM(srcImage,uchar,i,j*3+1);
                     r=(int)CV_IMAGE_ELEM(srcImage,uchar,i,j*3+2);
                 }
                 else if(GRAY_TYPE==channel_1)
                 {
                     b=(int)CV_IMAGE_ELEM(srcImage,uchar,i,j);
                     g=b;
                     r=b;
                 }
                 desImage.setPixel(j,i,qRgb(r,g,b));
             }
         }

         ui->label->setPixmap(QPixmap::fromImage(desImage));

         cvNamedWindow("rrr", CV_WINDOW_AUTOSIZE);//opencv显示图像
         cvShowImage("rrr", pGrayImage);

}
<pre name="code" class="cpp">Form::~Form()
{
    delete ui;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值