一篇文章带你顺利通过Python OpenCV入门阶段

目录
  • 1. OpenCV 初识与安装
  • 2. OpenCV 模块简介
  • 3. OpenCV 图像读取,显示,保存
  • 4. 摄像头和视频读取,保存
  • 5. OpenCV 常用数据结构和颜色空间
  • 6. OpenCV 常用绘图函数
  • 7. OpenCV 界面事件操作之鼠标与滑动条
  • 8. 图像像素、通道分离与合并
  • 9. 图像逻辑运算
  • 10. 图像 ROI 与 mask 掩膜
  • 11. 图像几何变换
  • 12. 图像滤波
  • 13. 图像固定阈值与自适应阈值
  • 14. 图像膨胀腐蚀
  • 15. 边缘检测
  • 16. 霍夫变换
  • 17. 图像直方图计算及绘制
  • 18. 模板匹配
  • 19. 轮廓查找与绘制
  • 20. 轮廓特征属性及应用
  • 21. 高级部分-分水岭算法及图像修补
  • 22. GrabCut & FloodFill 图像分割、角点检测
  • 23. 特征检测与匹配
  • 24. OpenCV 应用部分之运动物体跟踪与人脸识别

1. OpenCV 初识与安装

本部分要了解 OpenCV (Open Source Computer Vision Library)的相关简介,OpenCv 可以运行在多平台之上,轻量级而且高效,由一系列 C 函数和少量 C++类构成,提供了 Python、Ruby、MATLAB 等语言的接口,所以在学习的时候,要注意查阅资料的语言实现相关问题。

这个阶段除了安装 OpenCV 相关库以外,建议收藏官方网址,官方手册,官方入门教程,这些都是最佳的学习资料。

模块安装完毕,需要重点测试 OpenCV 是否安装成功,可通过 Python 查询安装版本。

2. OpenCV 模块简介

先从全局上掌握 OpenCV 都由哪些模块组成。例如下面这些模块,你需要找到下述模块的应用场景与简介。

coreimgprochighguicalib3dfeatures2dcontribflanngpulegacymlobjdetectphotostitching

整理每个模块的核心功能,并完成第一个 OpenCV 案例,读取显示图片。

3. OpenCV 图像读取,显示,保存

安装 OpenCV 之后,从图像获取开始进行学习,包含本地加载图片,相机获取图片,视频获取,创建图像等内容。

只有先获取图像之后,才能对图像进行操作处理,信息提取,结果输出,图像显示图像保存

对于一个图像而言,在 OpenCV 中进行读取展示的步骤如下,你可以将其代码进行对应。

1.图像读取;

2.窗口创建;

3.图像显示;

4.图像保存;

5.资源释放。

涉及需要学习的函数有 cv2.imread()cv2.namedWindow()cv2.imshow()cv2.imwrite()cv2.destroyWindow()cv2.destroyAllWindows()cv2.imshow()cv2.cvtColor()cv2.imwrite()cv2.waitKey()

4. 摄像头和视频读取,保存

第一个要重点学习 VideoCapture 类,该类常用的方法有:

  • open() 函数;
  • isOpened() 函数;
  • release() 函数;
  • grab() 函数;
  • retrieve() 函数;
  • get() 函数;
  • set() 函数;

除了读取视频外,还需要掌握 Opencv 提供的 VideoWriter 类,用于保存视频文件。

学习完相关知识之后,可以进行这样一个实验,将一个视频逐帧保存为图片。

5. OpenCV 常用数据结构和颜色空间

这部分要掌握的类有 Point 类、Rect 类、Size 类、Scalar 类,除此之外,在 Python 中用 numpy 对图像进行操作,所以 numpy 相关的知识点,建议提前学习,效果更佳。

OpenCV 中常用的颜色空间有 BGR 颜色空间、HSV/HLS 颜色空间、Lab 颜色空间,这些都需要了解,优先掌握 BGR 颜色空间。

6. OpenCV 常用绘图函数

掌握如下函数的用法,即可熟练的在 Opencv 中绘制图形。

  • cv2.line();
  • cv2.circle();
  • cv2.rectangle();
  • cv2.ellipse();
  • cv2.fillPoly();
  • cv2.polylines();
  • cv2.putText()。

7. OpenCV 界面事件操作之鼠标与滑动条

第一个要掌握的函数是鼠标操作消息回调函数,cv2.setMouseCallback() ,滑动条涉及两个函数,分别是:cv2.createTrackbar()cv2.getTrackbarPos()

掌握上述内容之后,可以实现两个案例,其一为鼠标在一张图片上拖动框选区域进行截图,其二是通过滑动条让视频倍速播放。

8. 图像像素、通道分离与合并

了解图像像素矩阵,熟悉图片的像素构成,可以访问指定像素的像素值,并对其进行修改。

通道分离函数 cv2.split(),通道合并函数 cv2.merge()

9. 图像逻辑运算

掌握图像之间的计算,涉及函数如下:

cv2.add();cv2.addWeighted();cv2.subtract();cv2.absdiff();cv2.bitwise_and();cv2.bitwise_not();cv2.bitwise_xor()。

还可以研究图像乘除法。

10. 图像 ROI 与 mask 掩膜

本部分属于 OpenCV 中的重点知识,第一个为感兴趣区域 ROI,第二个是 mask 掩膜(掩码)操作 。

学习 ROI 部分时,还可以学习一下图像的深浅拷贝。

11. 图像几何变换

图像几何变换依旧是对基础函数的学习与理解,涉及内容如下:

  • 图像缩放 cv2.resize();
  • 图像平移 cv2.warpAffine();
  • 图像旋转 cv2.getRotationMatrix2D();
  • 图像转置 cv2.transpose();
  • 图像镜像 cv2.flip();
  • 图像重映射 cv2.remap()。

12. 图像滤波

理解什么是滤波,高频与低频滤波,图像滤波函数。

线性滤波:方框滤波、均值滤波、高斯滤波,
非线性滤波:中值滤波、双边滤波,

  • 方框滤波 cv2.boxFilter();
  • 均值滤波 cv2.blur();
  • 高斯滤波 cv2.GaussianBlur();
  • 中值滤波 cv2.medianBlur();
  • 双边滤波 cv2.bilateralFilter()。

13. 图像固定阈值与自适应阈值

图像阈值化是图像处理的重要基础部分,应用很广泛,可以根据灰度差异来分割图像不同部分,阈值化处理的图像一般为单通道图像(灰度图),核心要掌握的两个函数:

  • 固定阈值:cv2.threshold();
  • 自适应阈值:cv2.adaptiveThreshold()。

14. 图像膨胀腐蚀

膨胀、腐蚀属于形态学的操作,是图像基于形状的一系列图像处理操作。
膨胀腐蚀是基于高亮部分(白色)操作的,膨胀是対高亮部分进行膨胀,类似“领域扩张”, 腐蚀是高亮部分被腐蚀,类似“领域被蚕食”。

膨胀腐蚀的应用和功能:

  • 消除噪声;
  • 分割独立元素或连接相邻元素;
  • 寻找图像中的明显极大值、极小值区域;
  • 求图像的梯度;

核心需要掌握的函数如下:

  • 膨胀 cv2.dilate();
  • 腐蚀 cv2.erode()。

形态学其他操作,开运算闭运算顶帽黑帽形态学梯度 这些都是基于膨胀腐蚀基础之上,利用 cv2.morphologyEx() 函数进行操作。

15. 边缘检测

边缘检测可以提取图像重要轮廓信息,减少图像内容,可用于分割图像、特征提取等操作。

边缘检测的一般步骤:

  • 滤波: 滤出噪声対检测边缘的影响 ;
  • 增强: 可以将像素邻域强度变化凸显出来—梯度算子 ;
  • 检测: 阈值方法确定边缘 ;

常用边缘检测算子:

  • Canny 算子,Canny 边缘检测函数 cv2.Canny();
  • Sobel 算子,Sobel 边缘检测函数 cv2.Sobel();
  • Scharr 算子,Scharr 边缘检测函数 cv2.Scahrr() ;
  • Laplacian 算子,Laplacian 边缘检测函数 cv2.Laplacian()。

16. 霍夫变换

霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,该过程在一个参数空间中,通过计算累计结果的局部最大值,得到一个符合该特定形状的集合,作为霍夫变换的结果。

本部分要学习的函数:

  • 标准霍夫变换、多尺度霍夫变换 cv2.HoughLines() ;
  • 累计概率霍夫变换 cv2.HoughLinesP() ;
  • 霍夫圆变换 cv2.HoughCricles() 。

17. 图像直方图计算及绘制

先掌握直方图相关概念,在掌握核心函数,最后通过 matplotlib 模块对直方图进行绘制。计算直方图用到的函数是 cv2.calcHist()

直方图相关应用:

  • 直方图均衡化 cv2.equalizeHist();
  • 直方图对比 cv2.compareHist();
  • 反向投影 cv2.calcBackProject()。

18. 模板匹配

模板匹配是在一幅图像中寻找与另一幅模板图像最匹配(相似)部分的技术。

核心用到的函数如下:

  • 模板匹配 cv2.matchTemplate();
  • 矩阵归一化 cv2.normalize();
  • 寻找最值 cv2.minMaxLoc()。

19. 轮廓查找与绘制

核心要理解到在 OpenCV 中,查找轮廓就像在黑色背景中找白色物体。

常用函数:

  • 查找轮廓 cv2.findContours();
  • 绘制轮廓 cv2.drawContours() 。

最后应该掌握针对每个轮廓进行操作。

20. 轮廓特征属性及应用

这部分内容比较重要,并且知识点比较多,核心内容与函数分别如下:

  • 寻找凸包 cv2.convexHull() 与 凸性检测 cv2.isContourConvex();
  • 轮廓外接矩形 cv2.boundingRect();
  • 轮廓最小外接矩形 cv2.minAreaRect();
  • 轮廓最小外接圆 cv2.minEnclosingCircle();
  • 轮廓椭圆拟合 cv2.fitEllipse();
  • 逼近多边形曲线 cv2.approxPolyDP();
  • 计算轮廓面积 cv2.contourArea();
  • 计算轮廓长度 cv2.arcLength();
  • 计算点与轮廓的距离及位置关系 cv2.pointPolygonTest();
  • 形状匹配 cv2.matchShapes()。

21. 高级部分-分水岭算法及图像修补

掌握分水岭算法的原理,掌握核心函数 cv2.watershed()

可以扩展补充图像修补技术及相关函数 cv2.inpaint(),学习完毕可以尝试人像祛斑应用。

22. GrabCut & FloodFill 图像分割、角点检测

这部分内容都需要一些图像专业背景知识,先掌握相关概念知识,在重点学习相关函数。

  • GrabCut 算法 cv2.grabCut();
  • 漫水填充算法 cv2.floodFill();
  • Harris 角点检测 cv2.cornerHarris();
  • Shi-Tomasi 角点检测 cv2.goodFeaturesToTrack();
  • 亚像素角点检测 cv2.cornerSubPix()。

23. 特征检测与匹配

特征点的检测和匹配是计算机视觉中非常重要的技术之一, 在物体识别、视觉跟踪、三维重建等领域都有很广泛的应用。

OpenCV 提供了如下特征检测方法:

  • “FAST” FastFeatureDetector;
  • “STAR” StarFeatureDetector;
  • “SIFT” SIFT(nonfree module) Opencv3 移除,需调用 xfeature2d 库;
  • “SURF” SURF(nonfree module) Opencv3 移除,需调用 xfeature2d 库;
  • “ORB” ORB Opencv3 移除,需调用 xfeature2d 库;
  • “MSER” MSER;
  • “GFTT” GoodFeaturesToTrackDetector;
  • “HARRIS” (配合 Harris detector);
  • “Dense” DenseFeatureDetector;
  • “SimpleBlob” SimpleBlobDetector。

24. OpenCV 应用部分之运动物体跟踪与人脸识别

了解何为运动物体检测,OpenCV 中常用的运动物体检测方法有背景减法帧差法光流法,跟踪算法常用的有 meanShiftcamShift粒子滤波光流法 等。

  • meanShift 跟踪算法 cv2.meanShift();
  • CamShift 跟踪算法 cv2.CamShift()。

如果学习人脸识别,涉及的知识点为:

  • 人脸检测:从图像中找出人脸位置并标识;
  • 人脸识别:从定位到的人脸区域区分出人的姓名或其它信息;
  • 机器学习。

以上就是一篇文章带你顺利通过Python OpenCV入门阶段的详细内容,更多关于Python OpenCV的资料请关注我们其它相关文章!

(0)

相关推荐

  • 如何基于OpenCV&Python实现霍夫变换圆形检测

    简述 基于python使用opencv实现在一张图片中检测出圆形,并且根据坐标和半径标记出圆.不涉及理论,只讲应用. 霍夫变换检测圆形的原理 其实检测圆形和检测直线的原理差别不大,只不过直线是在二维空间,因为y=kx+b,只有k和b两个自由度.而圆形的一般性方程表示为(x-a)²+(y-b)²=r².那么就有三个自由度圆心坐标a,b,和半径r.这就意味着需要更多的计算量,而OpenCV中提供的cvHoughCircle()函数里面可以设定半径r的取值范围,相当于有一个先验设定,在每一个r来说,在

  • Python OpenCV实现边缘检测

    本文实例为大家分享了Python OpenCV实现边缘检测的具体代码,供大家参考,具体内容如下 1. Sobel 算子检测 Sobel 算子是高斯平滑和微分运算的组合,抗噪能力很强,用途也很多,尤其是效率要求高但对细纹理不是很在意的时候. 对于不连续的函数,有: 假设要处理的图像为I,在两个方向求导. 水平变化:用奇数大小的模板对图像I卷积,结果为Gx.例如,当模板大小为3时,Gx为: 垂直变化:用奇数大小的模板对图像I卷积,结果为Gy.例如,当模板大小为3时,Gy为: 在图像的每个点,结合以上

  • opencv python简易文档之图片基本操作指南

    前言 最近在学习opencv,使用的是python接口.于是想着写些相关的笔记供以后参考,有不足之处希望大家指出. 使用python学习opencv需要下载opencv第三方库. 使用pip安装即可. 安装命令: pip install opencv-python pip install opencv-contrib-python(opencv的贡献库) 引入opencv import cv2 读取图片: img=cv2.imread('cat.jpg') # cat.jpg路径为相对路径 #

  • opencv python简易文档之图像处理算法

    目录 将图片转为灰度图 HSV 图像阈值 图像平滑 形态学-腐蚀操作 形态学-膨胀操作 开运算与闭运算 梯度运算 礼帽与黑帽 图像梯度处理 Canny边缘检测 图像金字塔 图像轮廓 直方图 直方图均衡化: 自适应均衡化: 傅里叶变换 模板匹配 总结 上一篇已经给大家介绍了opencv python图片基本操作的相关内容,这里继续介绍图像处理算法,下面来一起看看吧 将图片转为灰度图 import cv2 #opencv读取的格式是BGR img=cv2.imread('cat.jpg') # 将图

  • Python OpenCV 针对图像细节的不同操作技巧

    本系列专栏写作将采用首创的问答式写作形式,快速让你学习到 OpenCV 的初级.中级.高级知识. 6. 在 Python OpenCV 针对图像细节的不同操作 本篇博客的目标将为你解释一幅图像的拆解,包括图像像素的说明,图像属性信息的获取与修改, 图像目标区域 ROI 相关内容,以及图像通道的知识(包括拆分通道和合并通道) 这些内容在知识结构上与 numpy 库十分紧密,如果从学习的角度出发,建议你储备一下 numpy 相关知识. 读取修改图像的像素值 在之前的博客中,我们已经学到了如何读取一幅

  • Python OpenCV实现视频追踪

    本文实例为大家分享了Python OpenCV实现视频追踪的具体代码,供大家参考,具体内容如下 1. MeanShift 假设有一堆点集和一个圆形的小窗口.现在需要将此窗口移动到具有最高点集密度的区域,如下图: 第一个窗口C1是蓝色圆圈的区域.蓝色环的中心用蓝色矩形标记并命名为 C1_o.窗口中所有点的点集形成的质心在蓝色圆形点C1_r.显然,质心和环的质心不重合.移动蓝色窗口,使质心与先前获得的质心重合.在新移动的圆环的区域内再次找到圆环包围的点集的质心,然后再次移动.通常,形心和质心不重合.

  • 一篇文章带你顺利通过Python OpenCV入门阶段

    目录 1. OpenCV 初识与安装 2. OpenCV 模块简介 3. OpenCV 图像读取,显示,保存 4. 摄像头和视频读取,保存 5. OpenCV 常用数据结构和颜色空间 6. OpenCV 常用绘图函数 7. OpenCV 界面事件操作之鼠标与滑动条 8. 图像像素.通道分离与合并 9. 图像逻辑运算 10. 图像 ROI 与 mask 掩膜 11. 图像几何变换 12. 图像滤波 13. 图像固定阈值与自适应阈值 14. 图像膨胀腐蚀 15. 边缘检测 16. 霍夫变换 17.

  • 一篇文章带你搞懂Python类的相关知识

    一.什么是类 类(class),作为代码的父亲,可以说它包裹了很多有趣的函数和方法以及变量,下面我们试着简单创建一个吧. 这样就算创建了我们的第一个类了.大家可以看到这里面有一个self,其实它指的就是类aa的实例.每个类中的函数只要你不是类函数或者静态函数你都得加上这个self,当然你也可以用其他的代替这个self,只不过这是python中的写法,就好比Java 中的this. 二.类的方法 1.静态方法,类方法,普通方法 类一般常用有三种方法,即为static method(静态方法),cl

  • 一篇文章带你搞定Python多进程

    目录 1.Python多进程模块 2.Python多进程实现方法一 3.Python多进程实现方法二 4.Python多线程的通信 5.进程池 1.Python多进程模块 Python中的多进程是通过multiprocessing包来实现的,和多线程的threading.Thread差不多,它可以利用multiprocessing.Process对象来创建一个进程对象.这个进程对象的方法和线程对象的方法差不多也有start(), run(), join()等方法,其中有一个方法不同Thread线

  • 一篇文章带你详细了解python中一些好用的库

    目录 时间库-arrow 使用背景 安装arrow arrow使用 游标卡尺shift 获取arrow对象 arrow的类型转换和时区修改 总结 时间库-arrow 使用背景 日期时间处理在实际应用场景中无处不在,所以这也成了编程语言中必不可少的模块,Python 也不例外.但是,你知道在Python中有多少个相关的模块吗?datetime.time.calendar. dateutil. pytz 等等. 你知道有多少种数据类型吗?date.time.datetime.tzinfo.timed

  • 一篇文章带你深入学习Python函数

    目录 函数的特性: 函数是对象: 函数可以删除: 总结 函数的特性: 函数是对象 函数可以删除 函数名字和函数本身完全是分开的 函数因为是对象,可以结合数据结构使用 函数因为是对象,可以作为函数参数 函数因为是对象,可以在嵌套在函数体内 内层函数对象能够记忆住父函数的变量 所有的函数都是对象,但是所有的对象并不一定都是函数 对象成为函数需要实现__call__协议 函数是对象: # 函数是对象:支持赋值操作. def test1(n): print(f"hello, {n}!") #

  • 一篇文章带你使用Typescript封装一个Vue组件(简单易懂)

    一.搭建项目以及初始化配置 vue create ts_vue_btn 这里使用了vue CLI3自定义选择的服务,我选择了ts.stylus等工具.然后创建完项目之后,进入项目.使用快捷命令code .进入Vs code编辑器(如果没有code .,需要将编辑器的bin文件目录地址放到环境变量的path中).然后,我进入编辑器之后,进入设置工作区,随便设置一个参数,这里比如推荐设置字号,点下.这里是为了生成.vscode文件夹,里面有个json文件. 我们在开发项目的时候,项目文件夹内的文件很

  • 一篇文章带你搞定SpringBoot中的热部署devtools方法

    一.前期配置 创建项目时,需要加入 DevTools 依赖 二.测试使用 (1)建立 HelloController @RestController public class HelloController { @GetMapping("/hello") public String hello(){ return "hello devtools"; } } 对其进行修改:然后不用重新运行,重新构建即可:只加载变化的类 三.热部署的原理 Spring Boot 中热部

  • 一篇文章带你搞定SpringBoot不重启项目实现修改静态资源

    一.通过配置文件控制静态资源的热部署 在配置文件 application.properties 中添加: #表示从这个默认不触发重启的目录中除去static目录 spring.devtools.restart.exclude=classpath:/static/** 或者使用: #表示将static目录加入到修改资源会重启的目录中来 spring.devtools.restart.additional-paths=src/main/resource/static 此时对static 目录下的静态

  • 一篇文章带你解决 IDEA 每次新建项目 maven home directory 总是改变的问题

    Maven是基bai于项目对象模型,可以通du过一小段描述信息来管理zhi项目的构建,报告和文档的软件项dao目管理工具. 重装个系统,各种问题,idea 也出现各种问题 装了个新版的 idea 2020 2.x 版本的,不知道咋回事,其他都好使,就是创建 SpringBoot 项目时: 加载 pom.xml 总是出错,原因就是,新建立的项目 maven home directory 总是乱,没有安装 设置的默认方式 我试了,改当前项目的,不好使 该默认设置,不好使,网上的其他方法也试了,很奇怪

  • 一篇文章带你使用SpringBoot基于WebSocket的在线群聊实现

    一.添加依赖 加入前端需要用到的依赖: <dependency> <groupId>org.webjars</groupId> <artifactId>sockjs-client</artifactId> <version>1.1.2</version> </dependency> <dependency> <groupId>org.webjars</groupId> <

随机推荐