找回密码
 会员注册
查看: 36|回复: 0

PythonOpencvcv2.findContours()、cv2.drawContours()和cv2.contourArea()函数详解和运行示例

[复制链接]

2

主题

0

回帖

7

积分

新手上路

积分
7
发表于 2024-9-4 23:23:45 | 显示全部楼层 |阅读模式
为帮助大家理解和使用cv2.findContours()、cv2.drawContours()和cv2.contourArea()函数,本文通过对函数内容进行详解,并通过运行示例更直观表述。函数解析cv2.findContours()cv2.drawContours()cv2.contourArea()运行示例运行示例示例详解函数解析cv2.findContours()cv2.findContours是OpenCV中的一个函数,用于在二值图像中查找轮廓。以下是该函数的详细解释和参数说明:函数原型cv2.findContours(image,mode,method[,contours[,hierarchy[,offset]]])参数:image:输入图像,通常是一个二值图像。mode:轮廓检索模式。它可以是以下值之一:cv2.RETR_EXTERNAL:只检索最外层的轮廓。cv2.RETR_LIST:检索所有轮廓,并以列表形式返回。cv2.RETR_CCOMP:检索所有轮廓,并以树状结构(contourhierarchy)形式返回。此时,轮廓被分为不同的层级。cv2.RETR_TREE:检索所有轮廓,并以完整的树状结构形式返回。method:轮廓近似方法。它可以是以下值之一:cv2.CHAIN_APPROX_NONE:存储轮廓上的所有点。cv2.CHAIN_APPROX_SIMPLE:压缩水平、垂直和对角方向的轮廓点。cv2.CHAIN_APPROX_TC89_L1和cv2.CHAIN_APPROX_TC89_KCOS:使用L1和KOS链逼近算法。contours(可选):输出参数,返回检测到的轮廓。hierarchy(可选):输出参数,返回轮廓的层次结构。它是一个多通道多维数组,其中每个轮廓由三个数组组成:[next,previous,first_contour]。其中,“next”是下一个轮廓的索引,“previous”是上一个轮廓的索引,“first_contour”是起始轮廓的索引。offset(可选):偏移量,指定从哪里开始搜索轮廓。例如,如果指定了(10,10),则从图像的(10,10)位置开始搜索轮廓。返回值:如果指定了contours参数,则此函数返回被检测到的第一个轮廓的索引;否则,不返回任何内容。123456789101112131415161718192021cv2.drawContours()cv2.drawContours是OpenCV中的一个函数,用于在图像上绘制轮廓。以下是该函数的详细解释和参数说明:函数原型:cv2.drawContours(image,contours,contourIdx,color[,thickness[,lineType[,hierarchy]]])参数:image:输入/输出图像。你可以提供一个初始图像(用于绘制轮廓)或提供一个空图像(将返回绘制好的轮廓图像)。contours:输入轮廓的列表。通常,这是通过cv2.findContours函数获得的轮廓列表。contourIdx:要绘制的轮廓的索引。如果要绘制所有轮廓,则将其设置为-1。color:轮廓的颜色。通常使用BGR格式,例如(255,0,0)表示蓝色。thickness(可选):线条的厚度。如果为负数(如-1),则会填充轮廓内部。lineType(可选):线条类型,可以是cv2.LINE_8,cv2.LINE_4,或cv2.LINE_AA。hierarchy(可选):轮廓的层次结构信息,通常与cv2.findContours一起使用。1234567891011cv2.contourArea()cv2.contourArea()是OpenCV中的一个函数,用于计算轮廓的面积。这个函数对于分析图像中的对象或区域非常有用。函数原型:cv2.contourArea(contour[,oriented_area])参数:contour:这是一个轮廓的点集,通常通过cv2.findContours()函数获得。oriented_area(可选):如果提供了这个参数,它返回有方向的面积。0表示顺时针方向,正数表示逆时针方向。返回值:返回轮廓的面积。123456789运行示例运行示例importcv2importnumpyasnp#加载图像并转为灰度图image=cv2.imread('./images/36.jpg')gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)#二值化处理_,thresh=cv2.threshold(gray,127,255,cv2.THRESH_BINARY)#查找轮廓contours,hierarchy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)fori,contourinenumerate(contours):cnt_area=cv2.contourArea(contour)print(cnt_area)ifcnt_area>200:cv2.drawContours(image,contours,i,(0,0,255),3)#用红色线条绘制第一个轮廓##绘制第一个轮廓#cv2.drawContours(image,contours,0,(0,0,255),3)#用红色线条绘制第一个轮廓##计算第一个轮廓面积#cnt_area=cv2.contourArea(contours[0])#print(cnt_area)cv2.imshow('erzhihua',thresh)cv2.imwrite("36_erzhihua.jpg",thresh)cv2.imshow('Contours',image)cv2.imwrite("36_Contours.jpg",image)cv2.waitKey(0)cv2.destroyAllWindows()1234567891011121314151617181920212223242526272829原图:二值化图像:轮廓图像:示例详解(1)读取一幅名为36.jpg的图像.(2)使用cv2.cvtColor()函数进行灰度图像转换。(3)使用cv2.threshold()函数进行二值化处理。(4)使用cv2.findContours()函数查找图像中的轮廓。(5)使用cv2.contourArea()函数计算轮廓的面积。(6)判断轮廓的面积是否大于200,如大于则进行(7)。(7)使用cv2.drawContours()函数将轮廓画到原图像中。(8)展示和保存图像。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-5 08:55 , Processed in 0.431951 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表