【图像处理OpenCV(C++版)】——初学OpenCV


前言

😊😊😊欢迎来到本博客😊😊😊

🌟🌟🌟 本专栏主要结合OpenCV和C++来实现一些基本的图像处理算法并详细解释各参数含义,适用于平时学习、工作快速查询等,随时更新。

😊😊😊 具体食用方式:可以点击本专栏【OpenCV快速查找(更新中)】–>搜索你要查询的算子名称或相关知识点,或者通过这篇博客👉通俗易懂OpenCV(C++版)详细教程——OpenCV函数快速查找(不断更新中)]查阅你想知道的知识,即可食用。

🎁🎁🎁支持:如果觉得博主的文章还不错或者您用得到的话,可以悄悄关注一下博主哈,如果三连收藏支持就更好啦!这就是给予我最大的支持!😙😙😙


学习目标

  • 初识OpenCV,了解OpenCV相关背景知识
  • 了解OpenCV相关模块

一、 初识OpenCV

  OpenCV(全称:Open Source Computer Vision Library)是开源的计算机视觉和机器学习库,提供了C++、C、Python、Java接口,并支持Windows、Linux、Android、Mac OS平台。OpenCV自1999年问世以来,就已经成为计算机视觉领域学者和开发人员的首选工具。
  OpenCV是由Intel的小组进行开发的,在发布了一系列Beta版本后,1.0版本终于在2006年面市,2009年发布了重要的版本OpenCV 2.X,现在已经是2.4.13版本;从2014年开始,在继续更新OpenCV 2.X版本的同时,发布了OpenCV 3.X版本,现在已经更新到4.6版本了(截止2022.11)。

二、 OpenCV模块介绍

2.1 模块详解

  这里以在Windows下OpenCV 2.x版本为例,介绍整个OpenCV开发包的构成。解压缩所下载的OpenCV压缩包主要有两个文件夹,分别为buildsources

  sources是用来存放源码的,在其子文件夹modules下列出了OpenCV实现的各个模块。
  其中core、highgui和imgproc是最基础的模块,也是学习OpenCV的起点。
  本专栏主要以这三个模块为基础,重点介绍图像处理基础方法的数学原理。对于其他更高层次的方向及应用也会有相关介绍。

具体模块如下

模块名注释包含内容
core是OpenCV的核心模块,包含了最基本的结构(矩阵,点线和形状等),以及相关的基础运算/操作。OpenCV基本数据结构;动态数据结构;绘图函数;数组操作相关函数;辅助功能与系统函数和宏;与OpenGL的互操作
imgproc图像处理模块,包括图像相关的基础功能(滤波,梯度,改变大小等)和一些高级功能,即图像分割,直方图,形态分析和边缘/直线提取等。线性和非线性的图像滤波; 图像的几何变换;其它(Miscellaneous)图像转换;直方图相关;结构分析和形状描述;运动分析和对象跟踪;特征检测;目标检测等内容
highgui提供了用户界面和文件读取的基本函数,比如图像显示窗口的生成和控制,图像/视频文件的IO等,,可认为是一个轻量级的Windows UI 工具。媒体的I / O输入输出;视频捕捉;图像和视频的编码解码; 图形交互界面的接口等内容;关键点绘制函数和匹配功能绘制函数;关键点绘制函数和匹配功能绘制函数
video用于视频分析的常用功能。包含读取和写视频流函数、运动估计,背景分离,对象跟踪等视频处理相关内容。
calib3d三维重建,立体视觉和相机标定等的相关功能,校准单个/多个/多目摄像头。多视角几何算法;单个立体摄像头标定;物体姿态估计;立体相似性算法;3D信息的重建等等。
features2d二维特征相关的算法,包含检测、描述或匹配特征点等功能,比如ORB特征。特征检测和描述;特征检测器(Feature Detectors)通用接口;描述符提取器(Descriptor Extractors)通用接口;描述符匹配器(Descriptor Matchers)通用接口; 通用描述符(Generic Descriptor)匹配器通用接口;关键点绘制函数和匹配功能绘制函数
objdetect目标检测模块,用来检测人脸、行人或者其他物体包含Cascade Classification(级联分类)和Latent SVM这两个部分,如经典的基于Haar、LBP特征的人脸检测,基于HOG的行人、汽车等目标检测。
ml机器学习算法模块,包含一些视觉中最常用的传统机器学习算法,且能够和OpenCV友好交互。统计模型 (Statistical Models);一般贝叶斯分类器 (Normal Bayes Classifier);K-近邻 (K-NearestNeighbors);支持向量机 (Support Vector Machines);决策树 (Decision Trees);提升(Boosting);梯度提高树(Gradient Boosted Tree;随机树 (Random Trees); 超随机树 (Extremely randomized trees);期望最大化 (Expectation Maximization);神经网络 (Neural Networks); MLData
flann最近邻算法库,用于在多维空间进行聚类和检索,经常和关键点匹配搭配使用,平时很少直接使用,但在其他模块函数中,会调用到该算法高维的近似近邻快速搜索算法库,包含两个部分:快速近似最近邻搜索和聚类
gpu包含了一些gpu加速的接口,底层的加速是CUDA实现,前提是需要好的计算资源————————————
photo计算摄像学(Computational Photography)相关的接口,比较新的模块。包括图像修复和降噪。
stitching图像拼接模块,也是一个新的模块,不断更新中拼接流水线;特点寻找和匹配图像;估计旋转;自动校准;图片歪斜;接缝估测;曝光补偿;图片混合
nonfree受到专利保护的一些算法。包含特征检测和GPU相关的内容。最好不要商用,可能会被告!!
contrib一些实验性质的算法,新的算法,暂未加入OoenCV库中。包含了一些最近添加的不太稳定的可选功能。2.4.8里的这个模块有新型人脸识别,立体匹配,人工视网膜模型等技术,opencv3.4版本已将此模块去掉。
legacy一些被取消的接口,保留是考虑到向下兼容,OpenCV3.0已取消运动分析;期望最大化;直方图;平面细分(C API);特征检测和描述(Feature Detection and Description);描述符提取器(Descriptor Extractors)的通用接口;通用描述符(Generic Descriptor Matchers)的常用接口;匹配器
ocl利用OpenCL并行加速的一些接口,OpenCV3.0已取消,T-API取代。————————————
superres超分辨率模块,用的不多。————————————
viz基础的3D渲染模块,底层就是著名的3D工具包VTK(Visualization Toolkit)。————————————

  build文件夹存放的是通过源码包编译好的文件。它也是以下部署OpenCV用到的主要文件夹,其中:
   
–>doc子文件夹
:有两个最重要的学习OpenCV的文档(可能没有哦,但不影响),即:
     -->opencv2refman.pdf (函数手册,介绍了所有函数的声明及参数解释);
     -->opencv_tutorials.pdf(函数使用实例);

   –>include子文件夹:存放的是OpenCV的头文件;
   –>x64和x86子文件夹:存放的是针对64位和32位Windows系统编译好的.dll和.lib文件;
   –>python子文件夹:存放的是OpenCV Python API的动态模块;
   –>java子文件夹:存放的是Java API的JAR包。

  了解了整个开发包的构成后,就可以开始进行学习实操,要注意的是OpenCV不断迭代更新,算子一直在更新,我们先把基本的,也是比较重要的算子学通、学透,其他算子学习起来也不是很困难的。

2.2 OpenCV2.x & OpenCV3.x区别

2.3 使用方法

  OpenCV将每个模块中的源文件编译成一个库文件 ,在使用时, 仅将所需的库文件添加到自己的项目中,与自己的源文件一起连接成可执行程序即可。


三、 总结

  最后,长话短说,大家看完就好好动手实践一下,切记不能三分钟热度、三天打鱼,两天晒网。OpenCV是学习图像处理理论知识比较好的一个途径,大家也可以自己尝试写写博客,来记录大家平时学习的进度,可以和网上众多学者一起交流、探讨,有什么问题希望大家可以积极评论交流,我也会及时更新,来督促自己学习进度。希望大家觉得不错的可以点赞、关注、收藏。


🚶🚶🚶 今天的文章就到这里啦~
喜欢的话,点赞👍、收藏⭐️、关注💟哦 ~
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
课程目的:OpenCV是应用非常广泛的开源视觉处理库,在图像处理、计算机视觉和自动驾驶中有着非常重要的作用。课程设计特色:(课程当前为第一期)1、C++与Python双语教学Python语言是在计算机视觉中应用最多的一种语言,在工作中,深度学习模型的训练基本上都是使用Python语言编写的训练代码。OpenCV在这个过程中用于图像的预处理(例如图像读取、数据增强)和后处理,还可以用于显示处理的结果,功能强大,使用方便。但是在功能的部署的时候,不管是部署在服务端还是PC端,开发语言基本上用的是C++,所以如何有效的使用OpenCV进行模型或者功能的部署尤为重要。C++语言应用的好坏,在面试中可以看出一个面试者的工程实践能力的强弱,两种语言的开发掌握好了可以使工作如虎添翼。2、全模块讲解我出了一本图书《学习OpenCV4:基于Python的算法实战》,虽然这本书是写的基于Python的算法实战,但是实际上这本书有详细的介绍算法的C++接口,还有一些C++方向的案例,是以Python为主。图书出的时候就想双语写作,只是限于篇幅没有成行。本课程不仅采用双语教学,更是对C++的每个模块都做讲解,我们知道,很多的书其实只讲imgproc,如果你翻开一本书图像的形态学运算和图像滤波都是作为独立章节讲解的,那么这本书基本上就可以确定是只是讲解了imgproc模块,但是其他的模块在工作中也有很重要的作用。例如:core模块定义了C++的基本数据结构和基本运算(如四则运算);highgui模块是可视化与交互的模块;feature2d是特征点与特征匹配相关算法所在的模块;ml是机器学习相关的模块;dnn是深度学习相关的模块,可以使用OpenCV进行深度学习模型的部署。这些是很多的书和课程都不会讲的。3、讲解细致本课程会从环境搭建开始讲解,环境搭建尤为重要。从我多年的授课经验总结来看,如果只是给了代码,很多的入门用户环境问题处理不好的话,后面的学习很难进行下去,甚至会丧失学习的信心。4、会讲解C++和Python的开发语法问题是入门用户的一大难关,特别是C++语言。大学只是教授了C语言相关的内容,C++很多同学只懂一点皮毛,所以写代码步履维艰,我们在讲解代码的过程中会顺带讲解C++和Python的内容。我们还会讲解编译相关知识,还有库的装载与链接,这些是学校里不会教的,目前也几乎没有课程讲解。5、讲师经验丰富我讲解过C++和OpenCV的多个课程,广受学员好评。我出过两本图书《深度学习计算机视觉实战》和《学习OpenCV4》,两本书都是细致入微的讲解,主要针对的就是初学者,所以能够很好的处理课程的难易程度。6、讲义准备充分讲义准备的充分细致,标识清楚明确,重点和疑难点突出。
OpenCV是一个开源计算机视觉库,提供了许多用于图像处理的函数和工具。下面是使用OpenCV C++实现图像处理基本操作的步骤: 1. 首先,需要在C++程序中包含OpenCV的头文件: ```c++ #include <opencv2/core/core.hpp> #include <opencv2/imgcodecs.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> #include <iostream> ``` 2. 读取图像文件并显示图像: ```c++ cv::Mat image = cv::imread("example.jpg"); // 读取图像文件 cv::imshow("Image", image); // 显示图像 cv::waitKey(0); // 等待用户输入任意键继续 ``` 3. 转换图像的颜色空间: ```c++ cv::Mat gray_image; cv::cvtColor(image, gray_image, cv::COLOR_BGR2GRAY); // 将图像从BGR色彩空间转换为灰度色彩空间 cv::imshow("Gray Image", gray_image); cv::waitKey(0); ``` 4. 图像的平滑滤波: ```c++ cv::Mat blur_image; cv::GaussianBlur(image, blur_image, cv::Size(5, 5), 0); // 高斯滤波 cv::imshow("Blur Image", blur_image); cv::waitKey(0); ``` 5. 图像的边缘检测: ```c++ cv::Mat canny_image; cv::Canny(image, canny_image, 100, 200, 3); // Canny边缘检测 cv::imshow("Canny Image", canny_image); cv::waitKey(0); ``` 6. 识别图像中的轮廓: ```c++ cv::Mat contour_image = image.clone(); // 克隆原始图像,以便在上面绘制轮廓 cv::cvtColor(image, gray_image, cv::COLOR_BGR2GRAY); // 首先将图像从BGR色彩空间转换为灰度色彩空间 cv::threshold(gray_image, gray_image, 100, 255, cv::THRESH_BINARY); // 二值化图像 std::vector<std::vector<cv::Point>> contours; // 存储轮廓点的向量 std::vector<cv::Vec4i> hierarchy; // 存储轮廓层次结构的向量 cv::findContours(gray_image, contours, hierarchy, cv::RETR_TREE, cv::CHAIN_APPROX_SIMPLE); // 查找轮廓 for (int i = 0; i < contours.size(); i++) // 遍历所有轮廓并绘制 { cv::Scalar color = cv::Scalar(0, 0, 255); // 定义轮廓颜色(红色) cv::drawContours(contour_image, contours, i, color, 2, cv::LINE_8, hierarchy, 0); // 在图像上绘制每个轮廓 } cv::imshow("Contour Image", contour_image); cv::waitKey(0); ``` 引用: opencv(c++)实现图像处理基本操作。常见头文件 #include<opencv2/core/core.hpp> #include<opencv2/imgcodecs.hpp> #include<opencv2/highgui.hpp> #include<opencv2/imgproc.hpp> #include<iostream> [^1]。引用:Opencv c++(图像处理)。openCV 中 cv::Rect 矩形类用法_sinat_38102206的博客-CSDN博客_cv rect [^2]。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cqy阳

预祝上岸,感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值