这是一篇学习量很大的文章 观前提醒,本篇文章涉及知识点巨大,建议先收藏,再慢慢学习。 本篇文章目的将为你详细罗列 Python OpenCV 的学习路线与重要知识点。核心分成 24 个小节点,全部掌握,OpenCV 入门阶段就顺利通过了。 1. OpenCV 初识与安装 本部分要了解 OpenCV (Open Source Computer Vision Library)的相关简介,OpenCv 可以运行在多平台之上,轻量级而且高效,由一系列 C 函数和少量 C++类构成,提供了 Python、Ruby、MATLAB 等语言的接口,所以在学习的时候,要注意查阅资料的语言实现相关问题。 这个阶段除了安装 OpenCV 相关库以外,建议收藏官方网址,官方手册,官方入门教程,这些都是最佳的学习资料。 模块安装完毕,需要重点测试 OpenCV 是否安装成功,可通过 Python 查询安装版本。 2. OpenCV 模块简介 先从全局上掌握 OpenCV 都由哪些模块组成。例如下面这些模块,你需要找到下述模块的应用场景与简介。 core 、 imgproc 、 highgui 、 calib3d 、 features2d 、 contrib 、 flann 、 gpu 、 legacy 、 ml 、 objdetect 、 photo 、 stitching 。 整理每个模块的核心功能,并完成第一个 OpenCV 案例,读取显示图片。 3. OpenCV 图像读取,显示,保存 安装 OpenCV 之后,从图像获取开始进行学习,包含本地加载图片,相机获取图片,视频获取,创建图像等内容。 只有先获取图像之后,才能对图像进行操作处理,信息提取,结果输出, 图像显示 , 图像保存 。 对于一个图像而言,在 OpenCV 中进行读取展示的步骤如下,你可以将其代码进行对应。 图像读取; 窗口创建; 图像显示; 图像保存; 资源释放。 涉及需要学习的函数有 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 中常用的运动物体检测方法有 背景减法 、 帧差法 、 光流法 ,跟踪算法常用的有 meanShift , camShift ,粒子滤波 , 光流法 等。 meanShift 跟踪算法 cv2.meanShift(); CamShift 跟踪算法 cv2.CamShift()。 如果学习人脸识别,涉及的知识点为: 人脸检测:从图像中找出人脸位置并标识; 人脸识别:从定位到的人脸区域区分出人的姓名或其它信息; 机器学习。