首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >基于OpenCV的图像形状检测(含源码)

基于OpenCV的图像形状检测(含源码)

作者头像
Color Space
发布2022-04-04 17:10:40
发布2022-04-04 17:10:40
4.4K0
举报

导读

本文给大家分享一个用OpenCV传统方法实现形状检测的小案例。

背景介绍

实例来源:https://github.com/akshaybhatia10/ComputerVision-Projects/tree/master/FindShapes

其中典型的测试图片如下:

上图中包含了矩形、正方形、三角形、圆形和五角形共5种形状,我们的目的是将其定位并标注对应的形状,效果如下:

实现步骤

【1】 图片转为灰度图,做二值化。原图比较简单,可以用固定阈值或OTSU阈值方法;

代码语言:javascript
复制
# 固定阈值
ret,thresh = cv2.threshold(gray, 70, 255, cv2.THRESH_BINARY_INV)
代码语言:javascript
复制
# OTSU阈值
ret,thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)

【2】 查找轮廓+轮廓多边形逼近,计算轮廓多边形逼近结果对应的边数量;

代码语言:javascript
复制
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】 待优化部分:

① 判断矩形和正方形,原代码中使用外接矩形宽高插值做标准,可以改成宽高比值做判断标准;

代码语言:javascript
复制
# 宽高插值小于3pixel
if abs(width - height) <=3:

改为W/H比值:

代码语言:javascript
复制
if abs(width * 1.0 / height) >= 0.95 and abs(width * 1.0 / height) <= 1.05:

② 区分星形(四角形/五角形)和正多边形(正八边形/正十边形)除了检测边数还可以加上凸包缺陷计算,可以将二者很好的区分;

③ 上面虽然是比较简单的图形,但是方法和思想可以共用,大家可以将自己的图像先处理简单后再做识别,必要时可以使用角点、夹角、凸包缺陷等方法;

测试图片与源码下载链接:

https://github.com/akshaybhatia10/ComputerVision-Projects/tree/master/FindShapes

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV与AI深度学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景介绍
  • 实现步骤
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档