OpenCV里对一个图片绘制轮廓,需要用到两个API:
cv.findContours(dst,cv.RETR_TREE,cv.CHAIN_APPROX_SIMPLE) 这里需要输入的是一个二值图,这里的RETR_TREE会绘制出内外的轮廓,如果改成RETR_EXTERNAL就只会绘制出外轮廓
cv.drawContours(src,contours,i,(0,0,0),10,8) 这是绘制出轮廓
代码如下:
def find_contours_demo():
src = cv.imread("D:/pythonTest/img/4.jpg")
cv.imshow("input",src)
src = cv.GaussianBlur(src,(3,3),0)
grey = cv.cvtColor(src,cv.COLOR_BGR2GRAY)
ret,dst = cv.threshold(grey,0,255,cv.THRESH_BINARY_INV|cv.THRESH_OTSU)
cv.imshow("output",dst)
contours,hierachy = cv.findContours(dst,cv.RETR_TREE,cv.CHAIN_APPROX_SIMPLE)
print(len(contours))
for i in range(len(contours)):
cv.drawContours(src,contours,i,(0,0,0),10,8)
cv.imshow("contoured image",src)
效果如下:
虽然有点瑕疵,但是可以看出能绘制出基本的轮廓。
在找到轮廓之后,可以使用以下的api来获取图像的一些特性:
cv.contourArea(contours[i]) 获取面积
cv.arcLength(contours[i],True) 获取周长
cv.boundingRect(contours[i]) 获取外接矩形
代码如下:
def measure_contours_demo():
src = cv.imread("D:/pythonTest/img/6.jpg")
cv.imshow("input", src)
src = cv.GaussianBlur(src, (3, 3), 0)
grey = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
ret, dst = cv.threshold(grey, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
cv.imshow("output", dst)
contours, hierachy = cv.findContours(dst, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
print(len(contours))
h,w = dst.shape
for i in range(len(contours)):
#面积
area = cv.contourArea(contours[i])
#周长
arclen = cv.arcLength(contours[i],True)
#外接矩形
x,y,ww,hh = cv.boundingRect(contours[i])
if area<500 or arclen<80:
continue
print("area:%d,arclen:%d" % (area, arclen))
cv.drawContours(src, contours, i, (0, 0, 223), 2, 8)
cv.imshow("contoured image", src)
在获取了连通图形的面积等特性后,可以选择性地绘出图形的轮廓
效果如下: