【OpenCV3编程入门学习笔记】——第1章 邂逅OpenCV

邂逅OpenCV

文章目录

  • 邂逅OpenCV
    • 前言
    • 1.1 OpenCV周边概念认知
      • 1.1.1 图像处理、计算机视觉与OpenCV
      • 1.1.2 OpenCV概述
      • 1.1.3 起源及发展
      • 1.1.4 应用概述
    • 1.2 OpenCV基本架构分析
    • 1.3 OpenCV3带来了什么
    • 1.4 OpenCV的下载、安装与配置
    • 1.5 快速上手OpenCV图像处理
      • 前期准备
      • 1.5.1 程序一 图像显示
      • 1.5.2 程序二 图像腐蚀
      • 1.5.3 程序三 图像模糊
      • 1.5.4 程序四 canny边缘检测
    • 1.6 OpenCV视频操作基础
      • 1.6.1 读取并播放视频
      • 1.6.2 调用摄像头采集图像
        • 最简单的调用
        • 增加canny边缘检测
    • 1.7 本章小结

前言

笔记系列

参考书籍:OpenCV3编程入门

作者:毛星云

版权方:电子工业出版社

出版日期:2015-02

笔记仅供本人参考使用,不具备共通性

笔记中代码均是OpenCV+Qt的代码,并非用vs开发,请勿混淆

1.1 OpenCV周边概念认知

1.1.1 图像处理、计算机视觉与OpenCV

  • 图像处理

    • Image Processing
    • 计算机对图像进行分析,以达到所需结果的技术,又称影像处理
    • 该技术包括
      • 图像压缩、增强和复原
      • 图像匹配、描述
      • 图像识别
    • 一般指数字图像处理(Digital Image Processing)
      • 数字图像是一个大的二维数组
        • 数组元素称为像素
        • 数组值称为灰度
      • 处理是指对数字图像进行
        • 去除噪声
        • 增强
        • 复原
        • 分割
        • 提取特征
    • 侧重于“处理”图像
  • 计算机视觉

    • Computer Vision
    • 用设备代替人眼对目标进行识别、跟踪和测量等机器视觉,并进一步做图形处理
    • 侧重于使用计算机来模拟人的视觉
  • OpenCV

    • Open Source Computer Vision Library

    • 一款基于开源发行的跨平台计算机视觉库

    • 实现了图像处理和计算机视觉发面的很多通用算法

1.1.2 OpenCV概述

  • Open Source Computer Vision Library
  • 开源计算机视觉库
  • 跨平台
  • 设计目标
    • 执行速度尽量快
    • 关注实时应用
  • 采用优化的C/C++代码编写
  • 能够多核处理
  • 提供MLL(Machine Learning Library)机器学习库

1.1.3 起源及发展

1.1.4 应用概述

  • 人机交互
  • 物体识别
  • 图像分区
  • 人脸识别
  • 动作识别
  • 运动跟踪
  • 机器人

1.2 OpenCV基本架构分析

初学OpenCV时,先了解一下OpenCV的整体模块架构,再重点学习和突破自己感兴趣的部分,就会有得心应手,一览众山小的学习体验

通过OpenCV安装路径下include目录里面头文件的分类存放,来略读一下它的庞杂组织架构

进入到...\opencv\build\include\opencv2目录

【OpenCV3编程入门学习笔记】——第1章 邂逅OpenCV_第1张图片

在该目录中,找到opencv_modules.hpp的hpp文件

该文件中存放的是OpenCV2中与新模块构造相关的说明代码:

/*
 *      ** File generated automatically, do not modify **
 *		**				文件自动生成,请勿修改				**
 *
 * This file defines the list of modules available in current build configuration
 *
 * 该文件定义了当前构建配置中可用的模块列表
 *
*/

// This definition means that OpenCV is built with enabled non-free code.
// 这个定义意味着OpenCV是用启用的非自由代码构建的
// For example, patented algorithms for non-profit/non-commercial use only.
// 例如,专利算法只能用于非营利/非商业用途。
/* #undef OPENCV_ENABLE_NONFREE */

#define HAVE_OPENCV_CALIB3D
#define HAVE_OPENCV_CORE
#define HAVE_OPENCV_DNN
#define HAVE_OPENCV_FEATURES2D
#define HAVE_OPENCV_FLANN
#define HAVE_OPENCV_GAPI
#define HAVE_OPENCV_HIGHGUI
#define HAVE_OPENCV_IMGCODECS
#define HAVE_OPENCV_IMGPROC
#define HAVE_OPENCV_ML
#define HAVE_OPENCV_OBJDETECT
#define HAVE_OPENCV_PHOTO
#define HAVE_OPENCV_STITCHING
#define HAVE_OPENCV_VIDEO
#define HAVE_OPENCV_VIDEOIO

如上,L17~L31就是OpenCV的所有模块,按照宏定义的顺序依次介绍

  • HAVE_OPENCV_CALIB3D ---- calib3d
    • Calibration(校准)和3D这两个词的组合缩写
    • 该模块主要是相机校准和三维重建相关的内容
    • 算法包括
      • 多视角几何算法
      • 单个立体摄像头标定
      • 物体姿态估计
      • 立体相似性算法
      • 3D信息的重建
      • ……
  • HAVE_OPENCV_CORE ---- core
    • 核心功能模块
    • 包含如下内容
      • OpenCV基本数据结构
      • 动态数据结构
      • 绘图函数
      • 数组操作相关函数
      • 辅助功能与系统函数和宏
      • 与OpenGL的互操作
  • HAVE_OPENCV_DNN ---- dnn
    • Deep Neural Network
    • 深层神经网络模块
    • 详细内容暂略
  • HAVE_OPENCV_FEATURES2D ---- features2d
    • 即Features2D
    • 2D功能框架
    • 包含内容如下
      • 特征检测和描述
      • 特征检测器通用接口
      • 描述符提取器通用接口
      • 描述符匹配器通用接口
      • 通用描述符匹配器通用接口
      • 关键点绘制函数和匹配功能绘制函数
  • HAVE_OPENCV_FLANN ---- flann
    • Fast Library for Approximate Nearest Neighbors
    • 高位的近似近邻快速搜索算法库
    • 包含内容如下
      • 快速近似最近邻搜索
      • 聚类
  • HAVE_OPENCV_GAPI ---- gapi
    • G-API(Graph API) - 超高效图像处理 pipeline 引擎已集成为opencv_gapi模块
    • 这是一个新的 API,允许在流水线级别上对图像处理/CV 算法进行卸载和优化。
    • 详细内容暂略
  • HAVE_OPENCV_HIGHGUI ---- highgui
    • 高层GUI图形用户界面
    • 包含媒体的输入输出、视频捕捉、图像和视频的编码解码、图形交互界面的接口等内容
  • HAVE_OPENCV_IMGCODECS
  • define HAVE_OPENCV_IMGPROC
  • HAVE_OPENCV_ML ---- ml
    • Machine Learning
    • 机器学习模块
    • 基本上是统计模型和分类算法
    • 包含如下内容:
      • 统计模型
      • 一般贝叶斯分类器
      • K-近邻
      • 支持向量机
      • 决策树
      • 提升
      • 梯度提高树
      • 随机树
      • 超随机树
      • 期望最大化
      • 神经网路
      • MLData
  • HAVE_OPENCV_OBJDETECTL ---- objectect
    • 目标检测模块
    • 包含Cascade Classification(级联分类)和Latent SVM两大部分
  • HAVE_OPENCV_PHOTO ---- photo
    • Computational Photography
    • 包含图像修复和图像去噪两部分
  • HAVE_OPENCV_STITCHING ---- stitching
    • images stitching
    • 图像拼接模块
    • 包含如下内容:
      • 拼接流水线
      • 特点寻找和匹配图像
      • 估计旋转
      • 自动校准
      • 图片歪斜
      • 接缝估测
      • 曝光补偿
      • 图片混合
  • HAVE_OPENCV_VIDEO ---- video
    • 视频分析组件
    • 包括运动估计、背景分离、对象跟踪等视频处理相关内容
  • HAVE_OPENCV_VIDEOIO ---- videoio
    • 视频输入输出组件
    • 主要是用来打开视频文件或者camera,输出对应文件/设备的流。

1.3 OpenCV3带来了什么

1.4 OpenCV的下载、安装与配置

此处主要提供Windows环境下Qt+Opencv的配置

转载文章:

Qt-OpenCV开发环境搭建(史上最详细)

拜小白教你Qt5.8.0+OpenCV3.2.0配置教程(详细版)

1.5 快速上手OpenCV图像处理

前期准备

在创建qt新项目后,需要在pro文件中添加如下代码,以能够使用OpenCV的库

//在pro文件的最后添加如下代码
INCLUDEPATH += F:\opencv\buildopencv\install\include\
               F:\opencv\buildopencv\install\include\opencv2\
               F:\opencv\buildopencv\install\include\opencv

LIBS += -L F:\opencv\buildopencv\install\x64\mingw\lib\libopencv_*.a

注意:只要使用到OpenCV的库,就必须加入上述代码

1.5.1 程序一 图像显示

在新版OpenCV中,图像显示过程非常简单,只需用imread函数载入到新版本的图像存储数据结构Mat类中,然后用imshow函数显示即可。

文件:main.cpp

#include "mainwindow.h"
#include 
//上面两个是qt有的,暂时不理会

#include 
using namespace cv;//包含cv命名空间

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //【1】载入图片
    Mat srcImage = imread("test.jpg");
    //图片要放在debug目录下,或者直接用完整的绝对地址,如下
    //Mat srcImage = imread("E:\\StudyDocuments\\Study-Documents-2021\\Year-2021\\Study_Note\\Qt\\Code\\opencv\\test.jpg");
    //【2】显示图像
    //此处不可显示中文,后期再寻解决之道
    imshow("[original image]",srcImage);
    //【3】等待任意键按下
    waitKey(0);
}

【OpenCV3编程入门学习笔记】——第1章 邂逅OpenCV_第2张图片

1.5.2 程序二 图像腐蚀

腐蚀,即用图像中的暗色部分“腐蚀”掉图像中的高亮部分

文件:main.cpp

#include "mainwindow.h"

#include 

#include       //OpenCV highgui模块头文件
#include       //OpenCV 图像处理模块头文件

using namespace cv;                         //包含cv命名空间

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    //【1】载入原图
    Mat srcImage = imread("E:\\StudyDocuments\\Study-Documents-2021\\Year-2021\\Study_Note\\Qt\\Code\\opencv\\test.jpeg");
    //【2】显示原图
    imshow("original image",srcImage);
    //【3】进行腐蚀操作
    Mat element = getStructuringElement(MORPH_RECT,Size(15,15));
    Mat dstImage;
    erode(srcImage,dstImage,element);
    //【4】显示效果图
    imshow("Effect picture",dstImage);
    waitKey(0);

    return 0;
}

【OpenCV3编程入门学习笔记】——第1章 邂逅OpenCV_第3张图片

程序首先载入和显示一幅原视图像(original image)

然后定义一个Mat类型的变量来获得getStructuringElement函数的返回值,即指定形状和尺寸的结构元素(内核矩阵)

接着调用erode函数进行图像腐蚀操作,最后调用imshow函数进行显示效果图(Effect picture)

1.5.3 程序三 图像模糊

图像模糊即使用OpenCV对图像进行均值滤波操作,其主要用到了blur函数

文件:main.cpp

#include "mainwindow.h"

#include 

#include 
#include 
using namespace cv;

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //【1】载入原始图
    Mat srcImage = imread("E:\\StudyDocuments\\Study-Documents-2021\\Year-2021\\Study_Note\\Qt\\Code\\opencv\\test.jpeg");
    //【2】显示原始图
    imshow("original image",srcImage);
    //【3】进行均值滤波操作
    Mat dstImage;
    blur(srcImage,dstImage,Size(7,7));
    //【4】显示效果图
    imshow("Effect picture",dstImage);
    waitKey(0);
    return 0;
}

代码很好理解,先照常加载显示原始图,再调用一次blur函数,最后显示效果图

【OpenCV3编程入门学习笔记】——第1章 邂逅OpenCV_第4张图片

1.5.4 程序四 canny边缘检测

文件:main.cpp

#include "mainwindow.h"

#include 

#include 
#include 
using namespace cv;

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //【0】载入原始图
    Mat srcImage = imread("E:\\StudyDocuments\\Study-Documents-2021\\Year-2021\\Study_Note\\Qt\\Code\\opencv\\test.jpeg");
    imshow("original image",srcImage);//显示原始图
    Mat dstImage,edge,grayImage;//定义参数
    //【1】创建与src同类型和大小的矩阵(dst)
    dstImage.create(srcImage.size(),srcImage.type());
    //【2】将原图像转换为灰度图像
    //此句代码的OpenCV2版为:
    //cvtColor(srcImage,grayImage,CV_BGR2GRAY);
    //此句代码的OpenCV3版为:
    cvtColor(srcImage,grayImage,COLOR_BGR2GRAY);
    //【3】先使用5x5内核来降噪
    blur(grayImage,edge,Size(5,5));
    //【4】运行Canny算子
    Canny(edge,edge,3,9,3);
    //【5】显示效果图
    imshow("Effect picture",edge);
    waitKey(0);
    return 0;
}

首先,照常载入图像并显示

然后将图像转变成灰度图,保存在grayImage

再用blur函数grayImage进行降噪处理(模糊处理),并将结果保存在edge

最后,调用Canny函数对edge进行边缘检测

【OpenCV3编程入门学习笔记】——第1章 邂逅OpenCV_第5张图片

1.6 OpenCV视频操作基础

1.6.1 读取并播放视频

#include "mainwindow.h"
#include 
#include 
#include 
using namespace cv;
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //【1】读入视频
    VideoCapture capture("E:/StudyDocuments/Study-Documents-2021/Year-2021/Study_Note/Qt/Code/opencv/test2.avi");
    if (!capture.isOpened())
    {
        qDebug()<< "can't open video";
        return -1;
    }

    //【2】虚幻显示每一帧
    while (1)
    {
        //定义一个Mat变量,用于存储每一帧图像
        Mat frame;
        //读取当前帧
        capture>>frame;
        //显示当前帧
        imshow("1",frame);
        //延时30ms
        waitKey(30);
    }
    return 0;

}

代码本身应该是没问题了,但可能是缺少ffmpeg库,也可能是缺少相应的解码器,该问题暂时未解决,先留着,日后返回来再看。

在这里插入图片描述

【问题已解决】

问题原因: 缺少ffmpeg的dll文件

详细解释: 在Cmake opencv时,程序无法正确从网上下载下来需要的ffmpeg组件,进而在编译时无法正确安装ffmpeg,从而导致视频文件无法正确读取
解决方法: 在”Qt-OpenCV开发环境搭建(史上最详细)“一文中,问题汇总部分的问题五
【OpenCV3编程入门学习笔记】——第1章 邂逅OpenCV_第6张图片

1.6.2 调用摄像头采集图像

最简单的调用

#include "mainwindow.h"
#include 
#include 
#include 
using namespace cv;
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //【1】从摄像头读入视频
    VideoCapture capture(0);//此处用0来代表调用摄像头
    if (!capture.isOpened())
    {
        qDebug()<< "can't open video";
        return -1;
    }

    //【2】虚幻显示每一帧
    while (1)
    {
        //定义一个Mat变量,用于存储每一帧图像
        Mat frame;
        //读取当前帧
        capture>>frame;
        //显示当前帧
        imshow("video",frame);
        //延时30ms
        waitKey(30);
    }
    return 0;

}

【OpenCV3编程入门学习笔记】——第1章 邂逅OpenCV_第7张图片

增加canny边缘检测

#include "mainwindow.h"
#include 
#include 
#include 
using namespace cv;
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //【1】从摄像头读入视频
    VideoCapture capture(0);//此处用0来代表调用摄像头
    if (!capture.isOpened())
    {
        qDebug()<< "can't open video";
        return -1;
    }
    Mat edges;

    //【2】循环显示每一帧
    while (1)
    {
        //定义一个Mat变量,用于存储每一帧图像
        Mat frame;
        //读取当前帧
        capture>>frame;
        //将原图像转换为灰度图像
        cvtColor(frame,edges,COLOR_BGR2GRAY);
        //使用3x3内核来降噪(2x3+1=7)
        blur(edges,edges,Size(7,7));
        //进行canny边缘检测
        Canny(edges,edges,0,30,3);
        //显示当前帧
        imshow("Effect video",edges);
        //延时30ms
        if(waitKey(30) >=0) break;
    }
    return 0;

}

【OpenCV3编程入门学习笔记】——第1章 邂逅OpenCV_第8张图片

1.7 本章小结

通过本章学习,我对OpenCV有了一个大概的了解,但同时也发现了,作为不太常见的Qt+OpenCV组合,我也面临着许多无从下手的难题,这意味着我必须更加努力钻研,更多地掌握Qt和OpenCV独有的特性,才能使我在接下来的学习过程中少走弯路。

你可能感兴趣的:(Qt+OpenCV基础学习,计算机视觉,opencv,qt5)