首页 > 编程语言 >基于OpenCV的图像形状检测(含源码)

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

时间:2022-10-18 13:31:07浏览次数:86  
标签:阈值 cv2 vertices len OpenCV 源码 图像 矩形 对应


导读

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

 背景介绍

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

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

基于OpenCV的图像形状检测(含源码)_深度学习

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

基于OpenCV的图像形状检测(含源码)_深度学习_02


 实现步骤

【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)

基于OpenCV的图像形状检测(含源码)_宽高_03

【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,对应为圆形;

基于OpenCV的图像形状检测(含源码)_宽高_04

【3】 结果绘制和输出。

基于OpenCV的图像形状检测(含源码)_宽高_05


基于OpenCV的图像形状检测(含源码)_常用函数_06

【4】 待优化部分:

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



# 宽高插值小于3pixel
if abs(width - height) <=3:

改为W/H比值:


if abs(width * 1.0) >= 0.95 and abs(width * 1.0) <= 1.05:

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

基于OpenCV的图像形状检测(含源码)_深度学习_07

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


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

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



—THE END—


标签:阈值,cv2,vertices,len,OpenCV,源码,图像,矩形,对应
From: https://blog.51cto.com/stq054188/5765914

相关文章

  • OpenCV无缝融合应用(四)--纹理平滑(附C++源码)
    导读本期将介绍并演示OpenCV中使用textureFlattening实现图像中指定区域纹理平滑的效果。介绍OpenCV图像无缝融合-seamlessClone介绍与使用(Python/C++源码)OpenCV无缝融合......
  • OpenCV无缝融合应用(二)--指定目标颜色改变(附C++源码)
    导读本期将介绍并演示OpenCV中使用colorChange实现图像中指定目标颜色改变的效果。介绍colorChange与seamlessClone同属于SeamlessCloning部分,算法均来自下面这篇论文:​​h......
  • OpenCV无缝融合应用(三)--局部区域亮度调整(附C++源码)
    导读本期将介绍并演示OpenCV中使用illuminationChange实现图像中局部区域亮度调整的效果。介绍OpenCV图像无缝融合-seamlessClone介绍与使用(Python/C++源码)OpenCV无缝融......
  • C++ | PaddleOCR+OpenCV实现文字识别步骤与代码演示
    导读本期将介绍并演示C++OpenCV使用PaddleOCR做文字识别的步骤与效果。介绍百度深度学习框架PaddlePaddle开源的OCR项目PaddleOCR近期霸榜github。使用测试后发现识别效果......
  • 实战 | 用Python和OpenCV搭建一个老人跌倒智能监测系统 (步骤 + 源码)
    导读本文将使用Python、OpenCV和MediaPipe搭建一个老人跌倒智能监测系统。(公众号:OpenCV与AI深度学习)背景介绍   老人监测系统是一种智能检测系统,可以检测老人是否躺在床......
  • OpenCV图像拼接函数vconcat()&hconcat()
        OpenCV图像直接拼接方法下面链接已做介绍,​​OpenCV常用图像拼接方法(一):直接拼接​​,只是这次我们将使用现成的函数实现,它们是vconcat()和hconcat(),当然也有一些......
  • Halcon实例转OpenCV:计算回形针方向
       Halcon中有一个计算回形针方向的实例clip.hdev,可以在例程中找到。原图如下:    处理后的结果图:    代码整理之后,核心部分如下:dev_close_window()dev_open_wi......
  • OpenCV加载图片显示对应类型(位深度)方法
     对于部分初学者,偶尔会想在代码中查看图片的位深度,一般我们会用Mat.type()来获得类型,但是默认输出的是整型数字,不便于理解,可能还需要自己对照宏定义去查看,这里有一段代码......
  • OpenCV4.2使用viz模块显示3D图像
        在OpenCV3D视觉中如果需要显示三维数据或图像就需要用到viz模块,viz是OpenCV的3D显示模块,OpenCV官方release版本不包含此模块,需要我们自己cmake编译。  Cmake步......
  • OpenCV绘制标记函数drawMarker()
       OpenCV绘制标记函数drawMarker(),作用是在给定位置绘制一个标记,以OpenCV4.4.0为例:​​https://docs.opencv.org/4.4.0/d6/d6e/group__imgproc__draw.html#ga644c4a170......