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

2 篇文章 0 订阅

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

   

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);
  5. }

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

调用的代码很简单:

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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
opencv——基于python语言实现》pdf 是一本介绍了使用Python语言实现OpenCV库的编程技术的电子书。 OpenCV 是一个广泛应用于计算机视觉领域的开源库,它提供了许多用于图像处理和计算机视觉的函数和算法。 该电子书首先介绍了OpenCV和Python的基本概念和背景知识,如图像处理的基本操作和图像编程的基本原理。它还详细介绍了OpenCV的各种图像处理算法和函数,并提供了许多示例代码和案例研究,以帮助读者理解和应用这些算法和函数。 该电子书还涵盖了如何使用Python与OpenCV进行人脸检测、目标跟踪、图像识别和图像分割等常见任务。它还介绍了如何利用OpenCV和Python进行视频处理和实时图像处理,并展示了如何与摄像头和外部设备进行交互。 这本书对于希望学习和应用OpenCV和Python进行图像处理和计算机视觉的人来说是非常有价值的。它详细讲解了OpenCV的各种函数和算法的使用方法,并提供了丰富的示例和案例研究。读者可以通过学习该书,深入了解OpenCV和Python的使用,并掌握图像处理和计算机视觉的基本原理和技术,从而能够应用于实际项目和应用。 总之,《opencv——基于python语言实现》pdf 是一本适合初学者和有一定基础的人学习和应用OpenCV和Python进行图像处理和计算机视觉的电子书。通过阅读该书,读者可以全面了解OpenCV库的使用方法和基本原理,并掌握使用Python语言进行图像处理和计算机视觉任务的技术。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值