摸索了一段时间了,期间杂七杂八干了很多零活,花在这上面的时间不是太多,现在回头把资料简单整理。

OpenCV和Qt学习在入门阶段最大的困惑时版本不统一所带来的影响,Qt稍微好一点,OpenCV目前的大多数资料都是基于1.0版本的,而我用的2.4.3(刚更新了2.4.4)在使用上还是有很多区别的,在使用相关的资料的时候就会带来很大的困惑。

OpenCV的版本区别


由于我连入门都算不上,更多的变化我也不懂,所以只能简单记录下。

从2.2版本以后OpenCV库被划分为几个模块,这些模块就对应着相应的库目录,如下图所示。

下面简要介绍整理几个主要模块,这块主要还是根据我的理解,详细信息可以参见安装目录下The OpenCV Tutorials 文档。

  1. opencv_core模块包含了opencv的核心功能,尤其是包含了基础的数据结构和算法功能
  2. opencv_imgproc模块包含了主要的图像处理功能
  3. opencv_highgui模块图像和视频的读写以及其他用户界面
  4. opencv_features2d模块包含了特征点的探测和描述以及匹配框架
  5. opencv_calib3d模块包含了相机配准校正,双目立体视觉以及三维重建相关功能
  6. opencv_video模块包含了视频分析的相关功能,如运动估计,特征跟踪,前景提取等
  7. opencv_objdetect模块包含了例如人脸检测之类的目标检测功能

而2.2以后的版本头文件包含也改为:

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

而老版本中多半是这样的方式:

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

为了保持对之前版本的兼容,这些头文件仍然能够使用,但是建议使用新的包含方式,cv.h文件如下,从中可以看出本质上这个文件已经包含了对2.2以后版本的头文件包含。

#ifndef __OPENCV_OLD_CV_H__
#define __OPENCV_OLD_CV_H__#if defined(_MSC_VER)#define CV_DO_PRAGMA(x) __pragma(x)#define __CVSTR2__(x) #x#define __CVSTR1__(x) __CVSTR2__(x)#define __CVMSVCLOC__ __FILE__ "("__CVSTR1__(__LINE__)") : "#define CV_MSG_PRAGMA(_msg) CV_DO_PRAGMA(message (__CVMSVCLOC__ _msg))
#elif defined(__GNUC__)#define CV_DO_PRAGMA(x) _Pragma (#x)#define CV_MSG_PRAGMA(_msg) CV_DO_PRAGMA(message (_msg))
#else#define CV_DO_PRAGMA(x)#define CV_MSG_PRAGMA(_msg)
#endif
#define CV_WARNING(x) CV_MSG_PRAGMA("Warning: " #x)//CV_WARNING("This is a deprecated opencv header provided for compatibility. Please include a header from a corresponding opencv module")

#include "opencv2/core/core_c.h"
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc_c.h"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/video/tracking.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/flann/flann.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/objdetect/objdetect.hpp
#include "opencv2/legacy/compat.hpp"#if !defined(CV_IMPL)
#define CV_IMPL extern "C"
#endif //CV_IMPL#if defined(__cplusplus)
#include "opencv2/core/internal.hpp"
#endif //__cplusplus#endif // __OPENCV_OLD_CV_H_

在更具体的接触上,细节地方还有很多,所以在网络上找参考程序的时候需要区分对待。

Qt下的OpenCV入门例程


一些基础性的东西可以参见之前的博客,这里贴出主要代码,这个小例子完成一个主要的功能,打开图片并显示。打开图片利用Qt的标准文件对话框,第一步是利用OpenCV创建窗口并显示。添加一个Button,转到信号槽添加代码:

void Widget::on_openButton_clicked()
{QString fileName = QFileDialog::getOpenFileName(this,tr("Open Image"),".",tr("Image Files (*.png *.jpg *.bmp)"));qDebug()<<"filenames:"<<fileName;image = cv::imread(fileName.toAscii().data());cv::namedWindow(fileName.toAscii().data(),CV_WINDOW_AUTOSIZE));    //display use a new windowcv::imshow((fileName.toAscii().data(), image);
}

同时还需要在对应的头文件中添加变量定义并添加对应的头文件:

private:Ui::Widget *ui;cv::Mat image;

这样就完成了一个基本的载入图像并显示的功能。

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

图片的显示主要问题还是在于QImage与Mat格式的不同,其中QImage是RGB排列,而Mat 是 BGR,同时两者格式包含的内容页不同,因此需要经过转换才能够显示。

下面直接给出主要文件的代码:

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_openButton_clicked()
{QString fileName = QFileDialog::getOpenFileName(this,tr("Open Image"),".",tr("Image Files (*.png *.jpg *.bmp)"));qDebug()<<"filenames:"<<fileName;image = cv::imread(fileName.toAscii().data());
//    cv::namedWindow((fileName.toAscii().data()),CV_WINDOW_AUTOSIZE);    //display use a new window
//    cv::imshow((fileName.toAscii().data()), image);displayMat(image);                      //display by the label
}//void Widget::displayMat(const cv::Mat &image)
void Widget::displayMat(Mat image)
{Mat rgb;QImage img;if(image.channels()==3){//cvt Mat BGR 2 QImage RGB
        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);}ui->imagelabel->setPixmap(QPixmap::fromImage(img));ui->imagelabel->resize(ui->imagelabel->pixmap()->size());
}

widegt.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QImage>
#include <QFileDialog>
#include <QTimer>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>using namespace cv;namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();private slots:void on_openButton_clicked();//void displayMat(const cv::Mat &image);void displayMat(Mat image);private:Ui::Widget *ui;cv::Mat image;
};#endif // WIDGET_H

程序运行效果如下图所示:

转载于:https://www.cnblogs.com/emouse/archive/2013/03/29/2988717.html

OpenCVQt学习之一——打开图片文件并显示相关推荐

  1. html打开xls文件并显示其内容 demo

    html打开xls文件并显示其内容 表格内容: html显示: 代码: <!DOCTYPE html> <html> <head><title>test ...

  2. HTML5页面显示本地图片,h5使用FileReader读取本地上传的图片文件并显示到浏览器...

    html> h5使用FileReader读取本地图片文件并显示到浏览器-赵克立博客 ! function(a, b) { var showimg = document.getElementByI ...

  3. 打开资源文件时显示说没有安装这个ActiveX控件 {648A5600-2C6E-101B-82B6-000000000014

    mscomm32.ocx免费下载地址: http://www.rayfile.com/zh-cn/files/aa702b11-e11a-11e1-9c94-0015c55db73d/ 一.现象描述: ...

  4. qaxwidget传递参数到html,记一次QT使用QAxWidget打开.html文件调用显示离线百度地图不能缩放,自定义图片不能显示解决方法...

    主要问题: 一开始用的是在线的,都没有什么问题,自定义图片均可以显示,可是后面试了一下离线百度地图,在qt中运行打开.html文件和在电脑上面直接双击打开此文件显示是有差别的,在qt生成的程序中,地图 ...

  5. 打开chm文件不能显示内容的解决办法

    小知识: CHM 意为 Compiled HTML.以CHM为扩展名的文件图标通常为一个带问号的文档图标,表示帮助文档,是 Microsoft 自 Windows 98 以来提供的一种帮助文档格式的文 ...

  6. 使用XMind打开.mmap文件不显示问题

    1.问题如下: 使用XMind直接打开.mmap文件时,不显示: 2.解决方式: 1.选择XMind左上方的'文件',然后选择'导入': 2.在弹出如下图页面选择Mindjet MindManager ...

  7. C# Winform开发 打开txt文件 并显示在 RichTextBox中 加上编辑后保存功能

    添加一个openFileDialog组件,然后编写对应函数:这里事先定义了一个RichTextBox rtbInfo: private void OpenFromFile(){openFileDial ...

  8. 如何打开sln文件并显示窗口_如何用VC 6.0 打开Sln的工程文件

    http://blog.csdn.net/zhongjling/article/details/8442173 如何用VC 6.0 打开Sln的工程文件?在解答这一问题之前,要弄清楚 DSW 文件与 ...

  9. 如何打开sln文件并显示窗口_在.sln文件中设置Visual Studio默认启动项目的简单方法...

    昨天在一台电脑上用git新签出一个项目进行build,却出现一堆编译错误,而在原先的开发机上build无任何错误.对比分析后发现,开发机上VS的启动项目(startup project)与这台电脑上的 ...

最新文章

  1. HTML(六)——表单验证、正则表达式、事件
  2. LOJ6354 洛谷4366:[Code+#4]最短路——题解
  3. 从下往上飞入的动画效果
  4. 无惧海量并发,运维准点下班全靠它
  5. 漫天飞舞的蒲公英你是我的幸福吗
  6. c++svd算法_AI算法工程师面试6
  7. html table 向上滚动,决策报表的表格自动向上滚动问题
  8. mysql中的sql在添加的操作中,id或者是某些字段,需要它添加自带的默认值,或者我们并不想对id或者某个字段赋值
  9. 一个在线挑选编程字体的网站
  10. 文件包含漏洞+php伪协议
  11. linux中wps默认安装目录,在Linux系统中安装使用WPS的方法
  12. 餐馆管理系统程序流程图_这个交付应用程序使您最喜欢的中国餐馆保持活力
  13. 记录一些视频直播测试地址 rtmp rtsp http
  14. 关于“元宇宙”,讲点你能听懂的
  15. 根据工作日/节假日收货要求计算预计发货时间
  16. edge怎么开启沉浸式阅读_美人鼓上舞!端午小长假,豫园将开启史上首次沉浸式国风庙会...
  17. 网络设备配置与管理(华为)基础系列 20190307
  18. lumaQQ移植到Android之重构篇
  19. 揭秘!中国人一定要知道的北斗卫星系统
  20. 【Python实战】“特种兵”们的专属游戏助手,助你吃鸡:极品小助手也是棒呆了~(“大吉大利,今W吃鸡”)

热门文章

  1. [转]OpenMP 入门指南
  2. 资料下载:敏捷个人的成长思考.pptx(第1次线下活动2011.04)
  3. 6.Hibernate多对多关系建立
  4. Kali Linux渗透测试实战 1.3 渗透测试的一般化流程
  5. 盲人浏览网页辅助工具之一
  6. SQL 全文索引 CONTAINS
  7. PAT1002. 写出这个数
  8. 问题 F: 成绩统计
  9. Cover Protocol官方提醒用户警惕诈骗网站
  10. 数据:PayPal 24小时内加密交易量达2.42亿美元创记录