您的位置:首页 > 编程语言 > Qt开发

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

2015-08-29 15:54 531 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: