OpenCV入门笔记(五) 轮廓检测
来源:互联网 发布:淘宝助理多店共享面单 编辑:程序博客网 时间:2024/06/10 08:11
轮廓(Contours),指的是有相同颜色或者密度,连接所有连续点的一条曲线。检测轮廓的工作对形状分析和物体检测与识别都非常有用。
在轮廓检测之前,首先要对图片进行二值化或者Canny边缘检测。在OpenCV中,寻找的物体是白色的,而背景必须是黑色的,因此图片预处理时必须保证这一点。
cv2.findContours函数
Python版示例如下,也可以参考【OpenCV-Python教程(11、轮廓检测)】【Contours : Getting Started】
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
1. 完整例子
import cv2#读入图片img = cv2.imread("1.png")# 必须先转化成灰度图gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 二值化ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINAEY)# 寻找轮廓contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 画出轮廓,-1,表示所有轮廓,画笔颜色为(0, 255, 0),即Green,粗细为3cv2.drawContours(img, contours, -1, (0, 255, 0), 3)# 显示图片cv2.namedWindow("Contours", cv2.NORMAL_WINDOW)cv2.imshow("Contours", img)# 等待键盘输入cv2.waitKey(0)cv2.destroyAllWindows()
2. 参数解释
这里的findContours
函数,有三个参数
- thresh -> 要寻找轮廓的图片,注意这里的轮廓会直接改变在thresh上,记得备份
- cv2.RETR_TREE -> 表示轮廓检索模式(Contour retrieval mode)为,检索所有的轮廓,且重组为一个有层次的嵌套轮廓。层次信息返回在hierarchy中。
- cv2.CHAIN_APPROX_SIMPLE -> 表示轮廓近似方法(Contour approximation method)。SIMPLE可以这样理解,假如一个矩形有1000个点,但是现在只用四个角的点表示就行了,即去掉冗余信息。
返回值也有两个,contours
和 hierarchy
对contours的理解如下
print "找到 %d 个轮廓" %(len(contours))print "第 0 个轮廓有 %d 个点" %(len(contours[0]))# 画出第0个轮廓cv2.drawContours(img, contours, 0, (0, 255, 0), 3)cv2.imshow("first contours", img)# 画出第1个轮廓cv2.drawContours(img, contours, 1, (0, 255, 0), 3)cv2.imshow("second contours", img)# 画出所有的轮廓cv2.drawContours(img, contours, -1, (0, 255, 0), 3)cv2.imshow("all contours", img)
对 hierarchy 的深究,可以参考这里:【Contours Hierarchy】
轮廓特征(Contour Features)
查找到轮廓以后,我们可以得出轮廓的一些特征信息,也可以在轮廓上做一些简单的操作,参考Python教程:【Contour Features】
1. 面积和周长示例
# 寻找轮廓contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 取第 0 个轮廓cnt = contours[0]# 轮廓面积area = cv2.contourArea(cnt)# 周长,或者说,弧长;第二个参数的True表示该轮廓是否封闭perimeter = cv2.arcLength(cnt, True)
2. 轮廓近似
轮廓近似(Contour Approximation),要理解概念,先来看下面的三张图。第一张是找到的轮廓;第二张近似的幅度很大,忽略了很多的细节;第三细节多一点.
OpenCV中是用 cv2.approxPolyDP()函数来进行轮廓的近似的。见代码:
# 假设取第30个轮廓为例cnt = contours[30]# 10%,即0.1的精确度epsilon = 0.1 * cv2.arcLength(cnt, True)approx = cv2.approxPolyDP(cnt, epsilon, True)# 这里是第二张,10%的精确度cv2.imshow("10% approximation", approx)
同理,第三张可以用1%的精确度来得到。
3. 计算凸包
涉及凸多面体和凹多面体的概念,不多解释。如下图,本来是一个手掌的形状,现在用最小的凸多面体把它包起来。其中,凸进去(Bulge Inside)的部分,称为凸包缺陷(Convexity Defects),即箭头处,即偏导的局部最大值处。
函数调用,以后用到再来细究吧!
hull = cv2.convexHull(cnt)cv2.imshow("hull", hull)
4. 矩形边框
矩形边框(Bounding Rectangle)是说,用一个最小的矩形,把找到的形状包起来。还有一个带旋转的矩形,面积会更小,效果见下图
上代码
# 用绿色(0, 255, 0)来画出最小的矩形框架x, y, w, h = cv2.boundingRect(cnt)cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)# 用红色表示有旋转角度的矩形框架rect = cv2.minAreaRect(cnt)box = cv2.cv.BoxPoints(rect)box = np.int0(box)img = cv2.drawContours(img, [box], 0, (0, 0, 255), 2)
PS:其他的形状,如 封闭的圆形
,椭圆
,直线
等,例子见这里【Contour Features】,原理差不多,不再赘述。
- OpenCV入门笔记(五) 轮廓检测
- OpenCV入门(二十六)-- 轮廓检测
- opencv程序五:轮廓检测
- OpenCV学习笔记(一) 轮廓检测
- opencv笔记6----轮廓检测
- openCV学习笔记(3):opencv轮廓检测应用例子
- 【OpenCV入门指南】第五篇 轮廓检测
- 【OpenCV入门指南】第五篇 轮廓检测
- OpenCv学习笔记(七):轮廓的检测
- Opencv学习笔记 第三篇 轮廓检测(一)
- OpenCV自学笔记4:轮廓检测
- Python-OpenCV 处理图像(五):图像中边界和轮廓检测
- Python-OpenCV 处理图像(五):图像中边界和轮廓检测
- OpenCV-Python教程(11、轮廓检测)
- OpenCV-Python教程(11、轮廓检测)
- OpenCV-Python教程(11、轮廓检测)
- OpenCV 轮廓检测
- OpenCV轮廓检测
- ios 获取设备的ip地址
- 数理逻辑资源
- pdf转换成html具体怎么转
- STL中的TBits使用
- 猫猫学iOS 之微博项目实战(8)用AFNetworking和SDWebImage简单加载微博数据
- OpenCV入门笔记(五) 轮廓检测
- 【从头开始写操作系统系列】使用 Bochs 调试操作系统
- Understanding Java Garbage Collection
- 金刚石图纹
- Spark入门三部曲之第三步Spark程序的开发和运行及WordCount
- Python Requests快速入门
- Mysql数据库导出导入
- 2014年下半年阅读书单
- poj1469 二分图匹配学习