(opencv5)轮廓检测函数

(opencv5)轮廓检测函数

contours, hierarchy = cv2.findContours(img, mode, method,[offset)

注意 : 1.输入为二值图像,黑色为背景,白色为目标

2.该函数会修改原图像,因此若想保留原图像在,则需拷贝一份,在拷贝图里修改。

img :

二值图像

mode:

  1. cv2.RETR_EXTERNAL: (retrieve external检测轮廓)只检测最外面的轮廓

  2. cv2.RETR_LIST: 检测的轮廓不建立等级关系,都是同级

  3. cv2.RETR_CCOMP: 建立两个等级的轮廓,上面一层为外边界,里面一层为内孔的边界信息

  4. cv2.RETR_TREE: 建立一个等级树结构的轮廓

offset:(可选参数)

  • 轮廓点的偏移量,格式为tuple,如(-10, 10)表示轮廓点沿X负方向偏移10个像素点,沿Y轴方向偏移10个像素点

method:

  1. cv2.CHAIN_APPROX_NONE : 存储所有边界点

  2. cv2.CHAIN_APPROX_SIMPLE:压缩垂直、水平、对角方向,只保留端点

  3. cv2.CHAIN_APPROX_TX89_L1:使用teh-Chini近似算法

  4. cv2.CHAIN_APPROX_TC89_KCOS:使用teh-Chini近似算法

返回值 :

  1. contours : 轮廓点。列表格式,每一个元素为一个三维数组(其形状为(n, 1, 2), 其中n表示轮廓点个数,2表示像素点坐标(x, y))。每一个元素表示一个轮廓。

  2. hierarchy : 轮廓间的层次关系,为三维数组,形状为(1, n, 4),其中n表示轮廓总个数,4指的是用4个数表示个轮廓间的相互关系。第一个数表示同级轮廓的下一个轮廓编号,第二个数表示同级轮廓的上一个轮廓编号,第三个数表示该轮廓下一级轮廓的编号,第四个数表示该轮廓的上一级轮廓的编号。

示例图片

示例代码01

 import cv2
 
 
 def cv_show(image, name):
     cv2.imshow(name, image)
     cv2.waitKey(0)
     cv2.destroyAllWindows()
 
 
 img = cv2.imread('tu1.jpg')
 # 转为灰度图
 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 # 二值化 超过127取255,没超过取0
 thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)[1]
 # 轮廓检测, 检测所有外轮廓, 存储所有边界点, 返回 轮廓点(列表格式),轮廓间的层次关系(三维数组)
 contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
 # 绘制轮廓前复制图像,不然原图会变哒!
 res = cv2.drawContours(img.copy(), contours, -1, (0, 0, 255), 2)
 print('contours', type(contours), contours)
 print('hierarchy', type(hierarchy), hierarchy)
 cv_show(res, 'res')

运行结果01

示例代码02

 import cv2
 
 
 def cv_show(image, name):
    cv2.imshow(name, image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
 
 
 img = cv2.imread('tu1.jpg')
 # 转为灰度图
 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 # 二值化 超过127取255,没超过取0
 thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)[1]
 # 轮廓检测, 只检测外轮廓, 存储所有边界点, 返回 轮廓点(列表格式),轮廓见的层次关系
 contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
 # 绘制轮廓前复制图像,不然原图会变哒!
 res = cv2.drawContours(img.copy(), contours, -1, (0, 0, 255), 2)
 print('contours', type(contours), contours)
 print('hierarchy', type(hierarchy), hierarchy)
 cv_show(res, 'res')

运行结果02




 

posted on 2021-02-02 18:34  华子哈  阅读(277)  评论(0编辑  收藏  举报

导航