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;
}