导读
本文给大家分享一个用OpenCV传统方法实现形状检测的小案例。
背景介绍
实例来源:https://github.com/akshaybhatia10/ComputerVision-Projects/tree/master/FindShapes
其中典型的测试图片如下:
上图中包含了矩形、正方形、三角形、圆形和五角形共5种形状,我们的目的是将其定位并标注对应的形状,效果如下:
实现步骤
【1】 图片转为灰度图,做二值化。原图比较简单,可以用固定阈值或OTSU阈值方法;
# 固定阈值
ret,thresh = cv2.threshold(gray, 70, 255, cv2.THRESH_BINARY_INV)
# OTSU阈值
ret,thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
【2】 查找轮廓+轮廓多边形逼近,计算轮廓多边形逼近结果对应的边数量;
contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
print ('Number of contours', str(len(contours))
vertices = cv2.approxPolyDP(contour, 0.01*cv2.arcLength(contour,True), True)
# Checking for Triangles
if len(vertices) == 3:
len(vertices)得到轮廓逼近多边形的边数,其中:
len(vertices)==3,对应为三角形;
len(vertices)==4,对应为四边形,进一步根据外接矩形宽高判断是矩形还是正方形;
len(vertices)==8,对应为四角形;
len(vertices)==10,对应为五角形;
len(vertices)>=12,对应为圆形;
【3】 结果绘制和输出。
【4】 待优化部分:
① 判断矩形和正方形,原代码中使用外接矩形宽高插值做标准,可以改成宽高比值做判断标准;
# 宽高插值小于3pixel
if abs(width - height) <=3:
改为W/H比值:
if abs(width * 1.0) >= 0.95 and abs(width * 1.0) <= 1.05:
② 区分星形(四角形/五角形)和正多边形(正八边形/正十边形)除了检测边数还可以加上凸包缺陷计算,可以将二者很好的区分;
③ 上面虽然是比较简单的图形,但是方法和思想可以共用,大家可以将自己的图像先处理简单后再做识别,必要时可以使用角点、夹角、凸包缺陷等方法;
测试图片与源码下载链接:
https://github.com/akshaybhatia10/ComputerVision-Projects/tree/master/FindShapes
—THE END—
标签:阈值,cv2,vertices,len,OpenCV,源码,图像,矩形,对应 From: https://blog.51cto.com/stq054188/5765914