OpenCV&Qt学习之一——打开图片文件并显示

简介:

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

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

 

OpenCV的版本区别


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

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

image

下面简要介绍整理几个主要模块,这块主要还是根据我的理解,详细信息可以参见安装目录下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 window
    cv::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_OBJECT
    
public:
    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
复制代码

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

image

本文转自emouse博客园博客,原文链接:http://www.cnblogs.com/emouse/archive/2013/03/29/2988717.html,如需转载请自行联系原作者
相关文章
|
6月前
|
计算机视觉
Opencv学习笔记(十二):图片腐蚀和膨胀操作
这篇文章介绍了图像腐蚀和膨胀的原理、作用以及使用OpenCV实现这些操作的代码示例,并深入解析了开运算和闭运算的概念及其在图像形态学处理中的应用。
326 1
Opencv学习笔记(十二):图片腐蚀和膨胀操作
|
7月前
|
算法 计算机视觉
基于qt的opencv实时图像处理框架FastCvLearn实战
本文介绍了一个基于Qt的OpenCV实时图像处理框架FastCvLearn,通过手撕代码的方式详细讲解了如何实现实时人脸马赛克等功能,并提供了结果展示和基础知识回顾。
302 7
|
6月前
|
计算机视觉 Python
Opencv学习笔记(二):如何将整个文件下的彩色图片全部转换为灰度图
使用OpenCV库将一个文件夹内的所有彩色图片批量转换为灰度图,并提供了相应的Python代码示例。
75 0
Opencv学习笔记(二):如何将整个文件下的彩色图片全部转换为灰度图
|
6月前
|
计算机视觉 Python
Opencv学习笔记(一):如何将得到的图片保存在指定目录以及如何将文件夹里所有图片以数组形式输出
这篇博客介绍了如何使用OpenCV库在Python中将图片保存到指定目录,以及如何将文件夹中的所有图片读取并以数组形式输出。
458 0
Opencv学习笔记(一):如何将得到的图片保存在指定目录以及如何将文件夹里所有图片以数组形式输出
|
7月前
|
文字识别 计算机视觉 开发者
基于QT的OCR和opencv融合框架FastOCRLearn实战
本文介绍了在Qt环境下结合OpenCV库构建OCR识别系统的实战方法,通过FastOCRLearn项目,读者可以学习Tesseract OCR的编译配置和在Windows平台下的实践步骤,文章提供了技术资源链接,帮助开发者理解并实现OCR技术。
423 9
基于QT的OCR和opencv融合框架FastOCRLearn实战
|
6月前
|
计算机视觉
Opencv错误笔记(一):通过cv2保存图片采用中文命名出现乱码
在使用OpenCV的cv2模块保存带有中文命名的图片时,直接使用cv2.imwrite()会导致乱码问题,可以通过改用cv2.imencode()方法来解决。
306 0
Opencv错误笔记(一):通过cv2保存图片采用中文命名出现乱码
|
8月前
|
计算机视觉 Windows Python
windows下使用python + opencv读取含有中文路径的图片 和 把图片数据保存到含有中文的路径下
在Windows系统中,直接使用`cv2.imread()`和`cv2.imwrite()`处理含中文路径的图像文件时会遇到问题。读取时会返回空数据,保存时则无法正确保存至目标目录。为解决这些问题,可以使用`cv2.imdecode()`结合`np.fromfile()`来读取图像,并使用`cv2.imencode()`结合`tofile()`方法来保存图像至含中文的路径。这种方法有效避免了路径编码问题,确保图像处理流程顺畅进行。
696 1
|
8月前
【qt】如何读取文件并拆分信息?
【qt】如何读取文件并拆分信息?
90 0
|
6月前
|
Serverless 计算机视觉
语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
这篇文章介绍了如何使用OpenCV库通过mask图像绘制分割对象的外接椭圆。首先,需要加载mask图像,然后使用`cv2.findContours()`寻找轮廓,接着用`cv2.fitEllipse()`拟合外接椭圆,最后用`cv2.ellipse()`绘制椭圆。文章提供了详细的代码示例,展示了从读取图像到显示结果的完整过程。
121 0
语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
|
7月前
|
计算机视觉
基于QT的opencv插件框架qtCvFrameLearn实战
这篇文章详细介绍了如何基于Qt框架开发一个名为qtCvFrameLearn的OpenCV插件,包括项目配置、插件加载、Qt与OpenCV图像转换,以及通过各个插件学习OpenCV函数的使用,如仿射变换、卡通效果、腐蚀、旋转和锐化等。
121 10

推荐镜像

更多