使用Qt创建第一个OpenCV的Gui应用

写在前面

学习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头文件的包含格式一般是:

#include "cv.h"
#include "highgui.h"

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

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

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

打开并显示图片

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

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

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

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

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

void qttest1::on_Process_clicked()
{
   cv::flip(image, image, 1);
   cv::namedWindow("Output Image");
   cv::imshow("Output Image", image);
}

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

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

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

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

cvDestroyAllWindows();

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

小小改进一下吧

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

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

void qttest1::displayMat(cv::Mat image)
{
   cv::Mat rgb;
   QImage img;
   if(image.channels()==3)
   {
       //cvt Mat BGR 2 QImage RGB
       cv::cvtColor(image,rgb,CV_BGR2RGB);
       img =QImage((const unsigned char*)(rgb.data),
                   rgb.cols,rgb.rows,
                   rgb.cols*rgb.channels(),
                   QImage::Format_RGB888);
   }
   else
   {
       img =QImage((const unsigned char*)(image.data),
                   image.cols,image.rows,
                   image.cols*image.channels(),
                   QImage::Format_RGB888);
   }

   imagelabel->setPixmap(QPixmap::fromImage(img));
   imagelabel->resize(imagelabel->pixmap()->size());
}

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

使用Qt创建第一个OpenCV的Gui应用,布布扣,bubuko.com

时间: 2024-10-03 22:37:13

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

Three-js 创建第一个3D场景

1.一个场景至少需要的三种类型组件 相机/决定哪些东西将在屏幕上渲染    光源/他们会对材质如何显示,以及生成阴影时材质如何使用产生影响    物体/他们是在相机透视图里主要的渲染队形:方块.球体等 2.浏览器兼容 Moziller Firefox:4.0版本以后开始支持:    Google Chrome:第9版以后开始支持    Safari:5.1版本开始支持:    Opera:12.00版本以后开始支持.要让Opera支持WebGL,你还需要打开opera:config文件,设置We

QT creator中使用opencv

最近要用到opencv做图像方面的东西,网上很多是用VS加opencv,但自己对VS不怎么喜欢,想用QT Creator.在网上搜索了很多资料,终于花了一天的时间,在QT Creator上能使用opencv了. 需要的软件:(1)QT Creator.我的版本是4.8.5.这个版本还是在学习亚飞的QT Creator的时候安装的,网上有说QT版本低,而opencv版本高的话,可能在执行mingw32-make命令会报错.因此为了以防万一,我下载的低版本的opencv (2)opencv.我的版本

OpenCV学习笔记(一)安装及运行第一个OpenCV程序

1.下载及安装 OpenCV是一套开源免费的图形库,主要有C/C++语言编写,官网: http://opencv.org/ .在 http://opencv.org/downloads.html 可以找到个版本和各种平台的程序包.OpenCV的Windows平台安装包是放在SourceForge.net网站. 我下了2.4.4版,大概217M.安装包其实就是一个压缩包,安装过程就是解压到某个文件夹.我是安装到 E:\Soft\opencv 目录,安装后文件夹如下: 我们只需要关注“build”文

QT creator中使用opencv采集摄像头信息

之前在QT creator上成功编译了opencv,由于课题需要,需要采集摄像头的信息.故搜集了网上的一些资料,依葫芦画瓢的照着做了一下,终于简单的成功采集了信息. 打开QTcreator,新建一个widget工程. 在界面上放两个label 分别用来显示摄像头采集到的数据和照的照片. 在widget.h中的源代码如下: #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QImage> #include &

OpenCV学习笔记(01)我的第一个OpenCV程序(环境配置)

昨天刚刚考完编译原理,私心想着可以做一些与考试无关的东西了.一直想做和图像处理相关的东西,趁这段时间有空学习一下OpenCV,搭建环境真是一件麻烦的事情,搞了近三个小时终于OK了.先来张图: 大致描述一下步骤吧: 一.安装前准备 1.VS2012(网上看到很多用的VS2010,但是基本不影响) 2.OpenCV 安装包(我下载的是最新的2.4.9) 二.安装OpenCV 1.解压OPenCV 说是安装,其实就是解压,OpenCV的Windows安装程序就是一个自解压程序: 这里我解压到C:\Pr

【浅墨Unity3D Shader编程】之一 游戏场景的创建 &amp; 第一个Shader的书写

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] 作为一个系统介绍Unity3D中Shader编写的系列文章的开篇,本文的第一部分系列文章的前言,然后第二部分介绍了这个系列文章中我们会使用的游戏场景创建方式,最后一部分讲解了如何在Un

Qt创建窗体的过程

版权声明 本文为原创作品,请尊重作者的劳动成果.转载必须保持文章完整性,并以超链接形式注明原始作者“ tingsking18”和 主站点地址,方便其他朋友提问和指正. QT源码解析(一) QT创建窗口程序.消息循环和WinMain函数 QT源码解析(二)深入剖析QT元对象系统和信号槽机制 QT源码解析(三)深入剖析QT元对象系统和信号槽机制(续) QT源码解析(四)剖析Qt的事件机制原理 QT源码解析(五)QLibrary跨平台调用动态库的实现 QT源码解析(六)Qt信号槽机制与事件机制的联系

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

上一节通过 Web GUI 创建了 “first_local_net”,本节我们需要搞清楚底层网络结构有了哪些变化? 点击 “first_local_net” 链接,显示 network 的 subnet 和 port 信息. 在 Ports 列表中已经创建了一个 port,名称为 “(a5bd3746-3f89)”,IP 为 172.16.1.2, Attached Device 是 network:dhcp. 这里我们只需要知道该 port 对应的是 dhcp 的 interface,至于

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

在 ML2 配置文件中 enable local network 后,本节将开始创建第一个 local network. 我们将通过 Web GUI 创建第一个 local network. 首先确保各个节点上的 neutorn agent 状态正常.GUI 菜单 为 Admin -> System -> System Infomation -> Neutron Agents GUI 中有两个地方可以创建 network: 1. Project -> Network -> N