机器视觉实用工具集NO.9——寻找简单三角形、圆形、多边形工具实现

这篇博客介绍了如何利用OpenCV的SimpleBlobDetector API来检测图像中的特定形状,如近似等边形、圆形和椭圆。通过调整参数如minInertiaRatio、minConvexity和minCircularity,可以有效地查找图像中的联通区域并识别其形状特征。提供的Python代码示例展示了如何应用这些参数来检测不同形状。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

图像中获取到联通的区域后,如果区域的形状特征特别明显,可以根据联通区域的形状特征(圆度、凹度、凸度)等利用opencv自带的api(SimpleBlobDetector斑点检测)进行快速查找。
在这里插入图片描述

API参数介绍

cv2.SimpleBlobDetector斑点查找函数,里面可以通过输入调整参数进行形状特征查找。
可以通过:

查找近似等边形

设置圆度参数(minInertiaRatio),进行查找近似等边形状的图形,如下:
在这里插入图片描述

查找圆形、椭圆

通过凹凸度设置(minConvexity、minCircularity),查找圆形、椭圆:
在这里插入图片描述

查找矩形

通过凹凸度和圆度组合设置,查找矩形:
在这里插入图片描述

python代码

# -*- coding: utf-8 -*-
"""
Created on Thu Mar  3 08:40:20 2022

@author: JamesFei
"""
import cv2
import numpy as np
def BlobDetector(grayimg,minThreshold=10,maxThreshold=200,filterByArea=True,minArea=100,
                 filterByCircularity=True,minCircularity=0.1,filterByConvexity=True,
                 minConvexity=0.5,filterByInertia=True,minInertiaRatio=0.01):
    """
    根据阈值、联通面积、凹度、凸度、圆度组合特征查找感兴趣的联通区域
    """
    # Setup SimpleBlobDetector parameters.
    params = cv2.SimpleBlobDetector_Params()    
    # 阈值控制
    params.minThreshold = minThreshold;
    params.maxThreshold = maxThreshold;    
    # 像素面积大小控制
    params.filterByArea = filterByArea
    params.minArea = minArea    
    # 形状凸度控制
    params.filterByCircularity = filterByCircularity
    params.minCircularity = minCircularity    
    # 形状凹度控制
    params.filterByConvexity = filterByConvexity
    params.minConvexity = minConvexity    
    # 形状圆度控制
    params.filterByInertia = filterByInertia
    params.minInertiaRatio = minInertiaRatio    
    # 根据cv版本创建联通区域检测器
    ver = (cv2.__version__).split('.')
    if int(ver[0]) < 3 :
    	detector = cv2.SimpleBlobDetector(params)
    else : 
    	detector = cv2.SimpleBlobDetector_create(params)
    # 内接圆点
    if grayimg.shape[2]<3:
        points = detector.detect(grayimg) 
        return True,points
    elif grayimg.shape[2]==3:
        grayimg=cv2.cvtColor(grayimg, cv2.COLOR_BGR2GRAY)
        points = detector.detect(grayimg) 
        return True,points        
    else:
        print("image type error must be gray")
        return False,None


img=cv2.imread('./shape.png')        
res,pionts=BlobDetector(img.copy(),minThreshold=10,maxThreshold=100,filterByArea=False,minArea=0,
                 filterByCircularity=False,minCircularity=0,filterByConvexity=True,
                 minConvexity=0.47,filterByInertia=True,minInertiaRatio=0.38)
if res:
    output = cv2.drawKeypoints(img, pionts, np.array([]), (0,255,0), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
else:
    output=img
cv2.imshow('',output)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机智新语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值