QT 框架中快速应用OpenCV 基于图片

转载 2013年12月05日 14:30:36

1.显示图像

QWidget是QObject下的第一个子类,使用它显示图像会减少不必要的开销。首先定制一个自己需要的QWidget:

  1. class myWidget : public QWidget  
  2. {  
  3.   Q_OBJECT  
  4.   public:  
  5.     myWidget(const IplImage *img,QWidget *parent = 0);  
  6.     ~myWidget();  
  7.   protected:  
  8.     void paintEvent(QPaintEvent *e);  
  9.   private:  
  10.     IplImage* iplImg;  
  11.     QImage *qImg;  
  12. }; 

需要绘制一个图像,我重载paintEvent(QpaintEvent *e),我在这里面使用QPainter进行绘制。

  1. void myWidget::paintEvent(QPaintEvent *e)  
  2. {  
  3.     QPainter painter(this);  
  4.     painter.drawImage(QPoint(5,5),*qImg);  

rawImage(QPoint(5,5),qImg);的作用是将qImg绘制在左上顶点位于QPoint(5,5)处。

这里面有可能两个问题,第一个问题是要显示的图片太小,创建的Widget太大,最后显示比较丑陋。这时可以在此函数里面获得qImg的宽高,然后resize一下就好了。另外一个问题是:绘制的时候使用的是QImage,不是IplImage类型。关于这个问题论坛上有人专门写了IplImage <-> QImage的转换代码,我在这里不重复那个做法,一是有人已经做了,另外处于效率考虑,这里提供另一种方法。

通常同学们都是用cvLoadImage来读图片,保存在IplImage里面,在这里这个图片我们保存在img里面,然后通过img传进QWidget,然后我new一个QImage

  1. qImg = new QImage(QSize(img->width,img->height),QImage::Format_RGB888); 

我这里假设iplImg是RGB格式,且每个通道大小为8。然后创建一个IplImage 的文件头

  1. iplImg = cvCreateImageHeader(cvSize(img.width(),img.height()),8,3); 

此iplImage和QImage的不同之处在于QImage没有直接提供创建文件头的方法,可以通过如下方式创建只有文件头数据的QImage

  1. qImg = new QImage(QSize(0,0),QImage::Format_RGB888); 

另外两者的图像矩阵像素排列有点不同,比如IplImage中的BGR到了QImage中应该是RGB,当然单通道的灰度图是一样的,值得庆幸的是两者的像素矩阵都是形状相同的多维数组。这样我们可以通过指针共享这部分数据,一种方法如下:

  1. iplImg->imageData = (char*)qImg.bits(); 

将iplImg的图像矩阵指到qImg那里,以后我们只需要对IplImage运用opencv里面的函数进行处理,其实就直接在处理qImg里面的数据了。但是现在的图像数据还在img里面,首先得把数据搞到手,然后放到iplImg和qImg的共享区中去,另外将颜色排列以QImage中的RGB顺序为标准。

  1. if (img->origin == IPL_ORIGIN_TL)  
  2. {  
  3.  cvCopy(img,iplImg,0);  
  4. }  
  5. else  
  6. {  
  7.  cvFlip(img,iplImg,0);  
  8. }  
  9. cvCvtColor(iplImg,iplImg,CV_BGR2RGB); 

实际上只要做到这里图片就能显示了。如下图所示

QT 框架中快速应用OpenCV 基于图片

给出myWidget.cpp完整代码

  1. #include "myWidget.h"  
  2. #include <QtGui\QPainter> 
  3. #include <QtCore\QPoint> 
  4.  
  5. myWidget::myWidget(const IplImage *img,QWidget *parent /* = 0 */) : QWidget(parent)  
  6. {  
  7.   qImg = new QImage(QSize(img->width,img->height),  
  8.    QImage::Format_RGB888);  
  9.  iplImg = cvCreateImageHeader(cvSize(img->width,img->height),  
  10.   8,3);  
  11.  iplImg->imageData = (char*)qImg->bits();  
  12.  
  13.  if (img->origin == IPL_ORIGIN_TL)  
  14.  {  
  15.   cvCopy(img,iplImg,0);  
  16.  }  
  17.  else  
  18.  {  
  19.   cvFlip(img,iplImg,0);  
  20.  }  
  21.  cvCvtColor(iplImg,iplImg,CV_BGR2RGB);  
  22.  this->resize(img->width,img->height);  
  23. }  
  24. myWidget::~myWidget()  
  25. {  
  26.  cvReleaseImage(&iplImg);  
  27.  delete qImg;  
  28. }  
  29. void myWidget::paintEvent(QPaintEvent *e)  
  30. {  
  31.  QPainter painter(this);  
  32.  painter.drawImage(QPoint(0,0),*qImg);  

调用的代码很简单:

  1. int main(int argc,char* argv[])  
  2. {  
  3.  QApplication app(argc,argv);  
  4.  
  5.  IplImage *img = cvLoadImage("460.jpg",1);  
  6.  if (img)  
  7.  {  
  8.   myWidget *mw = new myWidget(img);  
  9.   mw->show();  
  10.  }  
  11.  int re = app.exec();  
  12.  cvReleaseImage(&img);  
  13.  return re;  

QT框架中快速应用OpenCV——基于图片

QT 框架中快速应用OpenCV 是本文要结束的内容,和MFC比较起来,QT的信号槽机制比MFC的信号机制慢,但是因为能很好的实现跨平台,所以我在这里总结一下可能对一些人有点用。     1.显...

QT框架中快速应用OpenCV

http://www.cnblogs.com/khler/archive/2010/07/04/1770886.html 和MFC比较起来,QT的信号槽机制比MFC的信号机制慢,但是因为...
  • zm_nong
  • zm_nong
  • 2012年05月03日 15:08
  • 665

QT框架中快速应用OpenCV

和MFC比较起来,QT的信号槽机制比MFC的信号机制慢,但是因为能很好的实现跨平台,所以我在这里总结一下可能对一些人有点用。OpenCV.China论坛上有一个帖子叫做《在MFC框架中快速应用Open...
  • masikkk
  • masikkk
  • 2013年03月30日 17:01
  • 1526

QT框架中快速应用OpenCV——基于视频播放

有些时候我们需要的是处理视频文件,比如AVI,当然也不过是图像序列。在由于QT运行时的多线程机制导致sleep函数不好使,可以通过其提供的QTimer来控制视频文件的播放。在给出例子之前要罗嗦两句QT...

QT 框架中快速应用OpenCV 基于视频播放

http://www.51cto.com/php/viewart.php?artID=271265   有些时候我们需要的是处理视频文件,比如AVI,当然也不过是图像序列。在由于QT运行时的多线程机制...
  • skc361
  • skc361
  • 2014年01月06日 17:48
  • 610

QT+opencv显示图片小程序窗体版

  • 2017年07月14日 15:40
  • 289KB
  • 下载

使用Qt显示openCV矩阵图片

1.首先配置QtCreator   可以参见 http://blog.csdn.net/cc7829290/article/details/8984706  使用的QtCreator,如果使用的其...

qt5.6+opencv2.4.10打开图片和视频

  • 2016年12月11日 15:37
  • 12.03MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:QT 框架中快速应用OpenCV 基于图片
举报原因:
原因补充:

(最多只允许输入30个字)