前言
图像中获取到联通的区域后,如果区域的形状特征特别明显,可以根据联通区域的形状特征(圆度、凹度、凸度)等利用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)