写在前面

学习OpenCV有一些小日子了,发现群里还有很多初学OpenCV的人像我当初一样跌跌撞撞到处找资料,所以在这里把学习笔记分享给大家,希望有志学习OpenCV进行计算机视觉活动的小伙伴们能少走一些弯路。

经过多方面查阅资料,了解到Qt开发平台对OpenCV的支持很好,但是在网上这方面的资料很少,能查到的大部分的图形交互设计都是基于OpenCV2.0之前的数据结构IplImage,而OpenCV现在官方已经更新到2.4.9版本了。偶然发现一本好书最近得到了一本好书《 OpenCV 2 Computer Vision Application Programming Cookbook》,下载的链接为http://ishare.iask.sina.com.cn/f/20485520.html?retcode=0, 2011年5月出版,全书都是基于OpenCV2.2版本的实现,采用了新的数据结构,该书现在已经有中文版《OpenCV2计算机视觉编程手册》,2013年7月科学出版社出版。我这里强烈建议利用C++开发的朋友们不要再使用老版本的数据结构了,实在影响开发效率。至于大家最熟悉的参考书《learning OpenCV》和《OpenCV教程——基础篇》这两本广为流传的书,我的看法是已经远远不能满足OpenCV新版本的学习了。老版本的OpenCV头文件的包含格式一般是:

  1. #include "cv.h"
  2. #include "highgui.h"

而2.2以后的版本头文件包含一般为:

  1. #include <opencv2/core/core.hpp>
  2. #include <opencv2/highgui/highgui.hpp>
  3. #include <opencv2/imgproc/imgproc.hpp>

为了保持对之前版本的兼容,这些头文件仍然能够使用,但是建议使用新的包含方式。

打开并显示图片

在Qt中,信号与槽是最重要的机制,这里我们可以创建一个按钮、或者菜单、工具条,来作为发射信号的载体,用一个槽函数来接收打开这个动作。

  1. QPushButton OpenImageButton = new QPushButton( tr("Find Image") );
  2. OpenImageButton->setDefault( false );
  3. OpenImageButton->setEnabled( true );

槽函数:打开文件可以利用Qt类QFileDialog来实现。

  1. void qttest1::on_OpenImage_clicked()
  2. {
  3. QString fileName = QFileDialog::getOpenFileName( this, tr( "Open Image" ), ".", tr("Image Files(*.png*.jpg*.jpeg*.bmp)"));
  4. image = cv::imread( fileName.toLocal8Bit().data());
  5. cv::imshow("Source Image", image);
  6. }

上面的函数已经实现了打开并显示图片。我们再添加一个按钮,并定义一个函数来对图片进行操作。

  1. void qttest1::on_Process_clicked()
  2. {
  3. cv::flip(image, image, 1);
  4. cv::namedWindow("Output Image");
  5. cv::imshow("Output Image", image);
  6. }

对于初学者,这些工作都做完之后,当然不要忘记连接信号与槽。

  1. connect(OpenImageButton,SIGNAL(clicked()),SLOT(on_OpenImage_clicked()));
  2. connect(ProcessButton,SIGNAL(clicked()),SLOT(on_Process_clicked()));

这些工作做完以后,就可以打开并显示图片啦!

当然,有些同学可能会出现下面这样的情况,记得在你的析构函数里释放对象,

cvDestroyAllWindows();

按理说,OpenCV2是自动释放对象的,楼主这里还没有搞清楚,也请搞清楚的同学留言,非常感谢。

小小改进一下吧

单独弹出一个窗口并显示总是给人突兀的感觉,下面实现Qt的窗体中显示图片,显示的方法有很多,不同的显示方法存在着效率等各方面的问题,这里使用QImage转QPixmap,然后用QLabel::setPixmap()来完成显示,还有比较常用的方法是在paintEvent()中直接画,具体的差异没有去探究。

我们写一个小函数来实现:

  1. void qttest1::displayMat(cv::Mat image)
  2. {
  3. cv::Mat rgb;
  4. QImage img;
  5. if(image.channels()==3)
  6. {
  7. //cvt Mat BGR 2 QImage RGB
  8. cv::cvtColor(image,rgb,CV_BGR2RGB);
  9. img =QImage((const unsigned char*)(rgb.data),
  10. rgb.cols,rgb.rows,
  11. rgb.cols*rgb.channels(),
  12. QImage::Format_RGB888);
  13. }
  14. else
  15. {
  16. img =QImage((const unsigned char*)(image.data),
  17. image.cols,image.rows,
  18. image.cols*image.channels(),
  19. QImage::Format_RGB888);
  20. }
  21.  
  22. imagelabel->setPixmap(QPixmap::fromImage(img));
  23. imagelabel->resize(imagelabel->pixmap()->size());
  24. }

最后的效果是这样,是不是简洁明了了很多?

使用Qt创建第一个OpenCV的Gui应用的更多相关文章

  1. 使用QT creator实现一个五子棋AI包括GUI实现(8K字超详细)

    五子棋AI实现 五子棋游戏介绍 五子棋的定义 五子棋是全国智力运动会竞技项目之一,是具有完整信息的.确定性的.轮流行动的.两个游戏者的零和游戏.因此,五子棋是一个博弈问题. 五子棋的玩法 五子棋有两种 ...

  2. 使用QT创建PythonGUI程序

    1. 挑选 GUI设计程序: wxPython Vs. pyQt4 参考链接:http://www.douban.com/group/topic/14590751/ (1):wxWidgets wxP ...

  3. Linux下Qt创建共享库与链接共享库详解

    随着程序写的逐渐变多,或多或少的我们都会使用别人写好的库:或者我们不想让别人看到我们的一些核心程序,可以将核心程序封装成库.本次和大家分享的是在Ubuntu下使用Qt生成共享库以及在Qt中链接共享库的 ...

  4. 创建第一个 local network(II)- 每天5分钟玩转 OpenStack(81)

    上一节通过 Web GUI 创建了 “first_local_net”,本节我们需要搞清楚底层网络结构有了哪些变化? 点击 “first_local_net” 链接,显示 network 的 subn ...

  5. 创建第一个 local network(I) - 每天5分钟玩转 OpenStack(80)

    在 ML2 配置文件中 enable local network 后,本节将开始创建第一个 local network. 我们将通过 Web GUI 创建第一个 local network. 首先确保 ...

  6. 【浅墨Unity3D Shader编程】之一 夏威夷篇:游戏场景的创建 & 第一个Shader的书写

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨)  ...

  7. QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数

    QT源码解析(一) QT创建窗口程序.消息循环和WinMain函数 分类: QT2009-10-28 13:33 17695人阅读 评论(13) 收藏 举报 qtapplicationwindowse ...

  8. Qt创建窗体的过程

    版权声明 本文为原创作品,请尊重作者的劳动成果.转载必须保持文章完整性,并以超链接形式注明原始作者“ tingsking18”和 主站点地址,方便其他朋友提问和指正. QT源码解析(一) QT创建窗口 ...

  9. QT creator中使用opencv

    最近要用到opencv做图像方面的东西,网上很多是用VS加opencv,但自己对VS不怎么喜欢,想用QT Creator.在网上搜索了很多资料,终于花了一天的时间,在QT Creator上能使用ope ...

随机推荐

  1. Android 逐帧动画isRunning 一直返回true的问题

    AnimationDrawabl主要通过xml实现逐帧动画,SDK实例如下: An AnimationDrawable defined in XML consists of a single < ...

  2. HDU-2126 Buy the souvenirs

    数组01背包. http://acm.hdu.edu.cn/showproblem.php?pid=2126 http://blog.csdn.net/crazy_ac/article/details ...

  3. UVa816 Abbott's Revenge

    Abbott's Revenge Time limit: 3.000 seconds Abbott’s Revenge  Abbott’s Revenge The 1999 World FinalsC ...

  4. JavaScript高级程序设计12.pdf

    第六章 面向对象的程序设计 ECMA中有两种属性:数据属性和访问器属性 数据属性的特性 [[Configurable]] 表示是否通过delete删除属性,是否重新定义属性,是否能把属性修改为访问器属 ...

  5. hdu 4474 大整数取模+bfs

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4474 (a*10+b)%c = ((a%c)*10+b%c)%c; 然后从高位开始枚举能填的数字填充, ...

  6. LianLianKan - HDU 4272(状态压缩)

    题目大意:有一列数据,可以从最上面的开始连接下面相同的元素,然后消除,不过距离不能超过6,询问最后能不能消除完整个数列. 分析:首先讨论一点最远能消除的地方,比如点的位置是x,如若想要消除x+1位置处 ...

  7. Android 解决ScrollView下嵌套ListView进页面不在顶部的问题

    以下为整理: 方法1 刚开始还可以,后来再调试时就不行了. 为了解决scrollview和listview冲突  设置了listview的高度   结果进页面就不是在顶部了 . 解决方案1:Scrol ...

  8. 使用php将数组转为XML

    <?php class Array_to_Xml { private $version = '1.0'; private $encoding = 'UTF-8'; private $root = ...

  9. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(44)-工作流设计-设计表单

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(44)-工作流设计-设计表单 系列目录 设计表单是比较复杂的一步,完成一个表单的设计其实很漫长,主要分为四 ...

  10. [PWA] Add web app to your Home Screen

    Clone: Link Modify the structure: Move css, js, image, index.html to an 'app' folder. manifest.json: ...