邂逅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目录

在该目录中,找到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\opencvLIBS += -L F:\opencv\buildopencv\install\x64\mingw\lib\libopencv_*.a

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

1.5.1 程序一 图像显示

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

文件:main.cpp

#include "mainwindow.h"
#include <QApplication>
//上面两个是qt有的,暂时不理会#include <opencv2/opencv.hpp>
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);
}

1.5.2 程序二 图像腐蚀

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

文件:main.cpp

#include "mainwindow.h"#include <QApplication>#include <opencv2/highgui/highgui.hpp>      //OpenCV highgui模块头文件
#include <opencv2/imgproc/imgproc.hpp>      //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;
}

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

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

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

1.5.3 程序三 图像模糊

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

文件:main.cpp

#include "mainwindow.h"#include <QApplication>#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
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函数,最后显示效果图

1.5.4 程序四 canny边缘检测

文件:main.cpp

#include "mainwindow.h"#include <QApplication>#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
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进行边缘检测

1.6 OpenCV视频操作基础

1.6.1 读取并播放视频

#include "mainwindow.h"
#include <QApplication>
#include <opencv2/opencv.hpp>
#include <QDebug>
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);//延时30mswaitKey(30);}return 0;}

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

【问题已解决】

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

详细解释: 在Cmake opencv时,程序无法正确从网上下载下来需要的ffmpeg组件,进而在编译时无法正确安装ffmpeg,从而导致视频文件无法正确读取
解决方法: 在”Qt-OpenCV开发环境搭建(史上最详细)“一文中,问题汇总部分的问题五

1.6.2 调用摄像头采集图像

最简单的调用

#include "mainwindow.h"
#include <QApplication>
#include <opencv2/opencv.hpp>
#include <QDebug>
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);//延时30mswaitKey(30);}return 0;}

增加canny边缘检测

#include "mainwindow.h"
#include <QApplication>
#include <opencv2/opencv.hpp>
#include <QDebug>
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);//延时30msif(waitKey(30) >=0) break;}return 0;}

1.7 本章小结

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

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

  1. 原创 OpenCV3编程入门 学习笔记(总)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_36163358/article/ ...

  2. OpenCV3编程入门 学习笔记(总)

    OpenCV3编程入门 学习笔记 2018.12.12-2018.12.29 此博客为在看过毛星云版<OpenCV3编程入门>后所总结的一本笔记,可供复习使用. 文章目录 OpenCV3编 ...

  3. Python快速编程入门#学习笔记01# |第一章 :Python基础知识 (Python发展历程、常见的开发工具、import模块导入)

    全文目录 ==先导知识== 1 认识Python 1.1.1 Python的发展历程 1.1.2 Python语言的特点 2. Python解释器的安装与Python程序运行 1.2.1 安装Pyth ...

  4. Python快速编程入门#学习笔记03# |第二章 :Python基础(代码格式、标识符关键字、变量和数据类型、数字类型以及运算符)

    全文目录 ==先导知识== 学习目标: 2.1 代码格式 2.1.1 注释 2.1.2 缩进 2.1.3 语句换行 2.2 标识符和关键字 2.2.1 标识符 2.2.2 关键字 2.3 变量和数据类 ...

  5. Opencv3编程入门学习笔记(五)之通道分离(split)与合并(merge)

    若要对Opencv中(BGR)颜色通道进行单一处理,那必然会涉及到通道分离(split)与合并(merge).那么本篇博客笔者记录了两个方法的使用方法和案例.案例来源于<Opencv3编程入门学 ...

  6. 【OpenCV3编程入门学习笔记】——第3章 HighGUI图形用户界面初步

    文章目录 前言 3.1 图形的载入.显示和输出到文件 3.1.1 OpenCV的命名空间 3.1.2 Mat类简析 3.1.3 图像的载入与显示概述 3.1.4 图像的载入:imread()函数 3. ...

  7. Opencv3编程入门学习笔记(三)之访问图像像素的三种方法

    访问图像像素的三种方法:指针访问,迭代器访问,动态地址访问.访问最快的为指针访问,以下算法在几毫秒,但指针访问容易造成内存泄漏:其次为迭代器访问:最后为动态地址访问. 以下程序是根据<OpenC ...

  8. Opencv3编程入门学习笔记(四)之split通道分离Debug过程中0xC0000005内存访问冲突问题

    这是笔者学习<Opencv3编程入门>的第四篇博客,这篇博客主要是解决在Windows系统下VS 2013中Debug含有split分离通道色彩函数时报出的0xC0000005内存访问冲突 ...

  9. Opencv3编程入门学习笔记(二)之显式创建Mat对象

    以下总结是基于<Opencv3编程入门>一书4.1节总结的内容进行验证与总结,验证环境均为Windows10 ---VS2013 C++环境,验证Opencv3.0提供的开发包. 1. 方 ...

最新文章

  1. 申请硕士学位不必发表论文,清华大学新规登上热搜:不把学术权力交给期刊审稿人...
  2. 山东台儿庄上演“火龙钢花”表演
  3. Django POST请求错误
  4. 必看2021年80后夫妻同时过信息系统项目管理师
  5. HTML5能为我们带来什么?(一)
  6. DCL并非单例模式专用
  7. [react] 举例说明什么是高阶组件(HOC)的反向继承
  8. 生活在REPL中(续):在REPL中动态加载依赖的库
  9. 深入机器学习系列之:快速迭代聚类
  10. 计算机硬件系统实验教程代码,计算机硬件系统实验教程
  11. (杂谈)如何在AMD官网下载旧版的驱动
  12. 在 Mac/win7 下上使用 Vagrant 打造本地开发环境
  13. 上帝向我们所怀的意念
  14. java窗口上 显示学号和姓名_java编程 完成下图所示的图形用户界面设计,要求在界面中输入个人的班级、学号、姓名信息后,点击“...
  15. android AlarmManager详解,Alarm的设定和取消。
  16. NewStarCTF2022-Week4-Web
  17. D90四种对焦点模式
  18. Jenkins 配置邮件通知
  19. 计算机网络_03_传输层(个人总结)
  20. 【STM32】USART接收不定长数据、防止数据溢出

热门文章

  1. 大神手机一周年:崛起了吗?
  2. C语言 static的使用
  3. C语言程序设计第四版 苏小红 习题答案 3.5
  4. gitlab-ci运行参数
  5. 经过八年研发,多美小壹推出六种医患服务机器人
  6. [导入]防止搏客被恶劣网站框架包含
  7. swift 3 和 xcode 8
  8. 手把手教你Java项目源码安全审查!
  9. 计算机应用数学基础,《计算机应用数学基础》冯天祥 编_孔网
  10. 计算机网络大题分析(一)