python cv2.findContours参数测试

news/2024/11/14 18:13:34/

findContours是连通域处理中最常用的函数之一,顾名思义,是实现图像中连通域的查找定位。结合cv2.drawContours/cv2.contourArea/cv2.boundingRect/cv2.minAreaRect等函数可以实现连通域轮廓的描绘,面积计算,外接四边形和最小外接四边形的求取。
opencv4中函数原型:

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

输出参数:

contours:查找到的轮廓的列表
hierarchy:保存每个连通域对应的属性

输入参数:

img: 输入的图像,可以为灰度图和二值图,常用的为二值图,背景为黑色,前景为白色
mode:表示轮廓的检索模式.常用的有cv2.RETR_EXTERNAL和cv2.RETR_TREEcv2.RETR_EXTERNAL  只检测外轮廓cv2.RETR_TREE 内外轮廓都检测此外还有,具体功能待探索:cv2.RETR_LISTcv2.RETR_CCOMP
method:轮廓的近似办法cv2.CHAIN_APPROX_NONE 存储所有的轮廓点cv2.CHAIN_APPROX_SIMPLE 压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息

函数测试如下:

def imshow(img, height, width, title, flagbatch):cv2.namedWindow(title, 0)  # 参数必须为0cv2.resizeWindow(title, width, height)cv2.moveWindow(title, 600, 300) # 窗口出现的位置cv2.imshow(title, img)if flagbatch:cv2.waitKey(0)
def TestContour():font = cv2.FONT_HERSHEY_SIMPLEXimg = cv2.imread('./datasets/logo1.jpg')gray = 255 - cv2.imread('./datasets/logo1.jpg',0) # 保证前景为白色_,binary = cv2.threshold(gray,100,255,cv2.THRESH_BINARY)H,W = binary.shapemode = [cv2.RETR_EXTERNAL,cv2.RETR_TREE]method = [cv2.CHAIN_APPROX_NONE,cv2.CHAIN_APPROX_SIMPLE]plt.figure()for mode_id in range(2):for met_id in range(2):pltimg = img.copy()title = str(mode_id) + '_' + str(met_id)contours, hierarchy = cv2.findContours(binary,mode[mode_id],method[met_id])contours = sorted(contours, key=lambda contour: cv2.contourArea(contour),reverse=True) # 按连通域面积从大到小排序Num = len(contours)for i in range(Num):area = cv2.contourArea(contours[i])(x, y, w, h) = cv2.boundingRect(contours[i])cv2.rectangle(pltimg, (x, y), (x + w, y + h), (0, 0, 255), 2, cv2.LINE_AA)cv2.putText(pltimg, "No.{},area:{}".format(i+1,area), (x-5, y - 5), font, 0.8, (255, 0, 0), 2)# imshow(img,H,W,'img',True)plt.subplot(2,2,2*mode_id + met_id + 1)plt.imshow(pltimg[:,:,[2,1,0]])  # plt 和 opencv的通道顺序相反,前者为rgb, 后者为bgrplt.title(title)plt.show()
  1. 无内轮廓图像
    在这里插入图片描述
    测试效果如下:
    在这里插入图片描述
    可以看到对于只有外轮廓的连通域,四种组合参数的效果一致。
  2. 有内外轮廓图像
    在这里插入图片描述
    测试效果如下:
    在这里插入图片描述
    可以看到对于有内外轮廓的连通域,external只检测外轮廓,tree则同时检测了内外轮廓。

http://www.ppmy.cn/news/325386.html

相关文章

pyhton opencv中cv2.findContours与cv2.drawContours

最近在做关于图像识别的东西,用到了寻找轮廓函数cv2.findContours和绘制轮廓函数cv2.drawContours 先看看cv2.findContours的定义: 如果嫌啰嗦(不想看英语),直接下拉,下面我有写用法与总结 def findContou…

cv2.drawContours()、cv2.findContours()、cv2.boundingRect(img)函数用法解析

cv2.drawContours()函数的功能是绘制轮廓,输入变量如下: cv2.drawContours(image, contours, contourIdx, color, thicknessNone, lineTypeNone, hierarchyNone, maxLevelNone, offsetNone) 第一个参数image表示目标图像, 第二个参数contour…

绘制轮廓 cv2.findContours函数及参数解释

cv2 绘制轮廓 cv2.findContours()注意事项mode参数method参数offset:(可选参数)返回值 cv2.findContours() def findContours(image, mode, method, contoursNone, hierarchyNone, offsetNone): # real signature unknown; restored from __doc__"…

opencv:图像轮廓检测 cv2.findContours() 与 cv2.drawContours()

1 cv2.findContours() OpenCV-Python接口中使用cv2.findContours()函数来查找检测物体的轮廓。 cv2.findContours(image, mode, method, contoursNone, hierarchyNone, offsetNone)参数描述返回image寻找轮廓的图像,注意输入的图片必须为二值图片。若输入的图片为…

cv2.findContours()返回函数详解

对于cv2.findContours() 函数,相信很多人都在使用,利用其进行轮廓的寻找,之后利用cnt[num],对第num个轮廓进行操作,但是该函数返回的三个参数具体表示的是什么呢? 下面就进行详细介绍,为了能够…

OpenCv查找轮廓-cv2.findContours()函数

contours, hier cv2.findContours(img,mode,method) 参数: 1. img: 要寻找轮廓的图像 2. mode:轮廓的检索模式(四种) 1.cv2.RETR_EXTERNAL 表示只检测外轮廓 2.cv2.RETR_LIST 检测的轮廓不建立等级关系 3.cv2.RETR_CCOMP 建立两个等级的轮…

图像轮廓检索函数cv2.findContours

findContours findContours函数主要作用是从二值图中检索轮廓。 用法 import cv2cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]])参数 image:8-bit单通道图像。该图像会将非0像素值视为1,0像素值视为0,因此也…

在cv2.findContours函数使用中,报ValueError: not enough values to unpack (expected 3, got 2)

cv2.findContours()函数 cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]]) 其中 第一个参数是需要寻找轮廓的图像; 第二个参数是轮廓的检索模式,有四种方式: cv2.RETR_EXTERNAL表示只检测外轮廓cv2.RETR_LIST检…