基本思路:将图片转化为灰度图后,过滤出边缘,并识别顶点,通过统计顶点的个数来判断形状
path="./images/shape.png"
img=cv.imread(path,0)##0--读入灰度图片,1--读入一副彩色图片,忽略alpha通道,-1----读入完整图片,包括alpha通道
imgContour=img.copy()
过滤出边缘
canny_img=cv.Canny(img,120,250)#参数根据情况调整
识别图片中形状的边缘文章来源:https://www.toymoban.com/news/detail-615978.html
contours,hierachy=cv.findContours(canny_img,mode=cv.RETR_EXTERNAL,method=cv.CHAIN_APPROX_NONE)
根据顶点数输出形状文章来源地址https://www.toymoban.com/news/detail-615978.html
for cnt in contours:
cv.drawContours(imgContour,cnt,-1,(255,0,0),4)##画出外边框
area=cv.contourArea(cnt)
if area>500:
#计算边长
peri=cv.arcLength(cnt,True)
#用多边形近似图片中的图像
vertices = cv.approxPolyDP(cnt,peri *0.02,True)##输出近似图像折点的坐标
corners = len(vertices)
x,y,w,h=cv.boundingRect(vertices)#一个图像的最小矩形边框,画把图形圈起来的正方形
cv.rectangle(imgContour,(x,y),(x+w,y+w),(0,255,0),4)
if corners == 3 :
cv.putText(imgContour,'triangle',(x,y-5),cv.FONT_HERSHEY_SIMPLEX,1,(0,0,255),2)
elif corners == 4 :
cv.putText(imgContour,'rectangle',(x,y-5),cv.FONT_HERSHEY_SIMPLEX,1,(0,0,255),2)
elif corners == 5 :
cv.putText(imgContour,'pentage',(x,y-5),cv.FONT_HERSHEY_SIMPLEX,1,(0,0,255),2)
elif corners >5 :
cv.putText(imgContour,'circle',(x,y-5),cv.FONT_HERSHEY_SIMPLEX,1,(0,0,255),2)
到了这里,关于opencv识别不同形状的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!