Python版
- 找到正方形轮廓
import cv2
import numpy as np
img=np.zeros((200,200),dtype=np.uint8)
img[50:150,50:150]=255
ret,thresh=cv2.threshold(img,127,255,0)#threshold阈值
image,contours,hierarchy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
color=cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
img=cv2.drawContours(color,contours,-1,(0,255,0),2)
cv2.imshow('contours',color)
cv2.waitKey()
cv2.destroyAllWindows()
效果图:
- 找到不规则形状轮廓
不过我发现如果背景是纯白色的,会识别失败,所以要求背景是黑色的!!(所以在实际识别的时候可能需要转变一些东西)
原图
import cv2
import numpy as np
img=cv2.pyrDown(cv2.imread('hammer.jpeg',cv2.IMREAD_UNCHANGED))#图像金字塔
ret,thresh=cv2.threshold(cv2.cvtColor(img.copy(),cv2.COLOR_BGR2GRAY),127,255,cv2.THRESH_BINARY)
image,contours,hier=cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
for c in contours:
#找到包围盒的坐标系
x,y,w,h=cv2.boundingRect(c)
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),3)#绿色
#找到最小区域
rect=cv2.minAreaRect(c)
#计算最小区域矩形的坐标
box=cv2.boxPoints(rect)
#归一坐标值到整型int
box=np.int0(box)
#画轮廓
cv2.drawContours(img,[box],0,(0,0,255),3)#此处红色0表示绘制轮廓数组里指定的轮廓
#计算封闭圆的半径和中心点
(x,y),radius=cv2.minEnclosingCircle(c)
#变成整形int
center=(int(x),int(y))
radius=int(radius)
#画圆
img=cv2.circle(img,center,radius,(0,255,255),3)#黄色
cv2.drawContours(img,contours,-1,(255,0,0),3)#蓝色-1表示绘制所有轮廓
cv2.imwrite('contourshammer.jpeg',img)
cv2.imshow('contours',img)
cv2.waitKey()
cv2.destroyAllWindows()
效果图
- 凸函数
(在之前的代码上添加)
cnt=contours[0]
epsilon=0.01*cv2.arcLength(cnt,True)
approx=cv2.approxPolyDP(cnt,epsilon,True)#计算近似的多边形框
hull=cv2.convexHull(cnt)#计算凸形状