qt下IplImage和QImage相互转换并显示

1、需要在qt下使用opencv处理图像,同时也需要经过处理的图像在界面上显示
mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QFileDialog>
#include "cv.h"
#include "highgui.h"
#define RGB_TYPE 3              //R,G,B三通道
#define GRAY_TYPE 1             //格雷图,单通道
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    QImage *qImage ;
    IplImage *iplImage;
    QImage  *IplImageToQImage( IplImage *srcImage);
    IplImage *QImageToIplImage(QImage *srcImage);
private slots:
    void on_pushButton_QImage_clicked();

    void on_pushButton_IplImage_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwdndow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    qImage = new QImage;
    iplImage = new IplImage;
}

MainWindow::~MainWindow()
{
    cvReleaseImage(&iplImage);
    delete ui;

}
QImage* MainWindow::IplImageToQImage( IplImage *srcImage)
{
    QImage *desImage=new QImage(srcImage->width,srcImage->height,QImage::Format_RGB32);
    for(int i=0;i<srcImage->height;i++)
    {
        for(int j=0;j<srcImage->width;j++)
        {
            int r,g,b;
            if(RGB_TYPE==srcImage->nChannels)
            {
                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==srcImage->nChannels)
            {
                b=(int)CV_IMAGE_ELEM(srcImage,uchar,i,j);
                g=b;
                r=b;
            }
            desImage->setPixel(j,i,qRgb(r,g,b));
        }
    }
    return desImage;
}
void MainWindow::on_pushButton_QImage_clicked()
{
    QString filename;
    filename=QFileDialog::getOpenFileName(this,tr("打开图片"),"",tr("images(*.bmp)"));
    QByteArray ba = filename.toLatin1();
    char*  ch;
    ch=ba.data();
    IplImage* image=cvLoadImage(ch,-1);
//    cvNamedWindow("1");
//    cvShowImage("1",image);
//    cvWaitKey(0);
    if(image!=NULL)
    {
        qImage=IplImageToQImage(image);
        if(qImage!=NULL)
        {
            ui->label_QImage->setPixmap(QPixmap::fromImage(*qImage));
        }
    }
}

void MainWindow::on_pushButton_IplImage_clicked()
{
    QString filename;
    filename=QFileDialog::getOpenFileName(this,tr("打开图片"),"",tr("images(*.bmp)"));
    QImage *img = new QImage;
    img->load(filename);
    if(img != NULL){
        ui->label_IplImage->setPixmap(QPixmap::fromImage(*img));
    }
    if(img!=NULL)
    {
        iplImage=QImageToIplImage(img);
      //  if(iplImage!=NULL)
       // {
         //   cvNamedWindow("QImageToIplImage");
            cvShowImage("q",iplImage);
            cvWaitKey(0);
    //    }
    }
}
IplImage *MainWindow::QImageToIplImage(QImage *srcImage)
{

    IplImage *desImage=cvCreateImage(cvSize(srcImage->width(),srcImage->height()),8,3);
    for(int i=0;i<srcImage->height();i++)
    {
        for(int j=0;j<srcImage->width();j++)
        {
            QRgb rgb=srcImage->pixel(j,i);
            CV_IMAGE_ELEM(desImage,uchar,i,j*3+0)=qBlue(rgb);
            CV_IMAGE_ELEM(desImage,uchar,i,j*3+1)=qGreen(rgb);
            CV_IMAGE_ELEM(desImage,uchar,i,j*3+2)=qRed(rgb);
        }
    }
    return desImage;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值