qt下IplImage和QImage相互转换并显示
2015-08-29 15:54
531 查看
1、需要在qt下使用opencv处理图像,同时也需要经过处理的图像在界面上显示
mainwindow.h
mainwdndow.cpp
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; }
相关文章推荐
- QTreeView使用模
- QT:QListIterator,QMutableListIterator基础
- QT:在QTableView中使用各种自定义委托
- Qt5 win7 64 下安装
- 在QT中添加LIB的方法
- Qt Creator 窗体控件自适应窗口大小布局
- QtCreator委托类 QItemDelegate,自定义委托类
- Qt 简介
- Qt学习之路【2】:调用父类构造函数
- 学习Qt5(1)
- qt中QString转char *
- QT的信号与槽机制介绍
- qt qml opengl QPainter画笔实例
- linux下配置opencv和qt
- Qt aero peek
- Inside Qt Series (十三):Qt/e体系结构概述
- 移植qt-4.8.5至 mini2440建立交叉编译及qt运行环境
- Qt编程中QDiaog的ESC建
- Qt入门学习——常用部件介绍
- QT和MFC