cv2.findContours()是非常常用的方法,在文字检测例如dbnet的后处理中,通常预测产生的概率图或者二值图要产生检测的边界,通常使用findContours方法找出边界在还原,除此之外一些对边缘的监督学习制作的标签也往往使用findContours方法。这个方法也有个缺点就是速度很慢,如果一次检测的二值图有很多的话,每个二值化都要找所有的边界点的话会很慢,虽然可以控制是否存储所有点,但是找的过程是针对所有点而言的。
void cv::findContours ( InputArray image,
OutputArrayOfArrays contours,
int mode,
int method,
Point offset = Point()
)
Python:
cv.findContours( image, mode, method[, contours[, hierarchy[, offset]]] ) -> contours, hierarchy
下面是第三个参数的解释,这里注意到第二个参数是轮廓检索模式,这和返回的hierarchy相关。通常来说,有四种,RETR_LIST,它只是提取所有的轮廓,而不去建立任何父子关系,所有的轮廓属于同一级。RETR_EXTERNAL,它只会返回最外边的轮廓,所有的子轮廓都会被忽略掉。RETR_CCOMP,这种模式下会返回所有的轮廓并将轮廓分为量级组织结果。RETR_TREE,返回所有的轮廓,并且创建一个完整的组织结构列表,这是最完整的一个模式。
opencv-python 4.0中,返回值只有两个了,一个是contours,一个是hierarchy。
cv2.drawContours()若第三个参数选择-1为绘制所有的轮廓,但是只绘制单个轮廓时,通常会采用,其中4是第四个,通常会对返回的contours做一个循环清洗,然后在一一绘制。
cnt = contours[4]
cv.drawContours(img, [cnt], 0, (0,255,0), 3)for box, area_box in zip(region, area):cv2.drawContours(img, [box], 0, (0, 255, 0), 2)cv2.namedWindow("img", cv2.WINDOW_NORMAL)cv2.imshow("img", img)cv2.imwrite("contours.png", img)cv2.waitKey(0)cv2.destroyAllWindows()
In [41]: img = cv2.imread(r'C:\Users\Desktop\car.jpg')
In [44]: imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)...: ret,thresh = cv2.threshold(imgray,127,255,0)...: contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)In [45]: cv2.drawContours(img,contours,-1,(0,255,0),3)In [46]: cv2.imshow('img',img)