首页 > 编程知识 正文

findcounters函数,drawcontours()参数说明

时间:2023-05-06 09:38:20 阅读:127049 作者:2425

1 .轮廓发现的定义是基于图像边缘提取的基础寻找对象轮廓的方法,因此边缘提取的阈值影响最终轮廓发现的结果。

轮廓可以简单地视为连接连续点(边界)的曲线,具有相同的颜色或灰度。 轮廓有助于形状分析和物体的检测识别。

要更准确,请使用二值化图像。 要在找到轮廓之前进行阈值化或Canny边界检测,查找轮廓的函数将修改原始图像。 如果在找到轮廓后还想使用原始图像,

必须将原始图像保存到其他变量中。 用OpenCV寻找轮廓,就像在黑色背景中寻找白色物体一样。 要找的物体必须是白色,背景必须是黑色。

2 .实现函数-cv2.findContours (,cv2.drawContours ) 2.1配置文件发现-cv2.findContours )参数为以下:cv2.findcontours OutputArray hierarchy,int mode,int method,Point offset=Point () )参数说明:image :单通道图像矩阵,可以是灰度2.coom 如果有多少轮廓,向量contours有多少元素?

3. hierarchy:vectorVec4i型。 Vec4i是Vecint,4的别名。 也就是说,由于容器内的各要素是包含4个int型变量的向量,所以在定义上,hierarchy也是向量,向量内的各要素保持包含4个int整数的数组。 向量hiararchy内的要素和轮廓向量contours内的要素一一对应,向量的容量相同。 hierarchy向量中每个元素的四个int类型变量—— hierarchy [ I ] [0]到hierarchy [ I ] [3]分别为第I个轮廓的下一个轮廓、上一个轮廓、父轮廓和嵌入轮廓的索引如果没有与当前轮廓对应的下一个轮廓、上一个轮廓、父轮廓或嵌入轮廓,则hierarchy [ I ] [0]到hierarchy [ I ] [3]的相应位将设置为默认值-1。

4.mode :定义配置文件的int类型搜索模式:

1 ) CV_RETR_EXTERNAL只检测最外周轮廓,忽略外周轮廓中包含的内周轮廓;

2 ) CV_RETR_LIST检测包括内周、外周轮廓在内的所有轮廓,所检测的轮廓不形成等级关系,相互独立,不具有等级关系。 即,由于在该检索模式中不存在父轮廓或嵌入轮廓,所以hierarchy向量内的所有要素的第3、第4个分量设为-1。 具体如下文所述;

3 ) CV_RETR_CCOMP检测所有轮廓,但所有轮廓仅形成两个等级关系,外周处于最高级别,如果外周内的内周轮廓包含其他轮廓信息,则内周内的所有轮廓属于最高级别;

4 ) CV_RETR_TREE,检测所有配置文件,所有配置文件创建分层树结构。 外部轮廓可以包含内部轮廓,而内部轮廓可以继续包含内部轮廓。

5. method:int类型,定义轮廓近似方法:

值1(cv_chain_approx_none )保存来自物体边界上所有连续轮廓点的contours向量;

值2(cv_chain_approx_simple )只存储轮廓的拐点信息,将所有轮廓拐点的点存储在contours矢量中,不存储拐点和拐点之间直线段上的信息点;

取3和4的值: CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain近似算法;

6 .点:偏移量。 相对于原始图像中相应点的所有轮廓信息的偏移量相当于为所检测的每个轮廓点加上该偏移量,点可以是负值。

2.2轮廓显示- cv2.drawContours ()参数为以下:cv2.drawcontours(img、contours、contourldx、color、thickness )参数

3 .代码import c v2 ascvimportnumpyasnpdefedge _ demo (image ) : blurred=cv.Gaussian blur (image,) 3,3 ),0 ) gray=

6SC1, 1, 0) # grad_y = cv.Sobel(gray, cv.CV_16SC1, 0, 1) # edge_output = cv.Canny(grad_x, grad_y, 30, 150) edge_output = cv.Canny(gray, 50, 150) return edge_outputdef contours_demo(image): """ . 轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同 的颜色或者灰度。 轮廓在形状分析和物体的检测和识别中很有用。 . 为了更加准确,要使用二值化图像。在寻找轮廓之前,要进行阈值化处理或者 Canny 边界检测 . 查找轮廓的函数会修改原始图像。如果你在找到轮廓之后还想使用原始图像的话, 你应该将原始图像存储到其他变量中. . 在 OpenCV 中,查找轮廓就像在黑色背景中超白色物体。要找的物体应该是白色而背景应该是黑色。 """ # dst = cv.GaussianBlur(image, (3, 3), 0) # gray = cv.cvtColor(dst, cv.COLOR_BGR2GRAY) # ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU) # cv.imshow("binary image", binary) binary = edge_demo(image) """ • 函数 cv2.findContours() 有三个参数, 第一个是输入图像,第二个是轮廓检索模式,第三个是轮廓近似方法。 • 检索模式: • CV_RETR_EXTERNAL - 只提取外层的轮廓 • CV_RETR_LIST - 提取所有轮廓,并且放置在 list 中 • CV_RETR_CCOMP - 提取所有轮廓,并且将其组织为两层的 hierarchy: 顶层为连通域的 外围边界,次层为洞的内层边界。 • CV_RETR_TREE - 提取所有轮廓,并且重构嵌套轮廓的全部 hierarchy • 逼近方法 (对所有节点, 不包括使用内部逼近的 CV_RETR_RUNS). 点的存贮情况,是不是都被存贮 • CV_CHAIN_CODE - Freeman 链码的输出轮廓. 其它方法输出多边形(定点序列). • CV_CHAIN_APPROX_NONE - 将所有点由链码形式翻译为点序列形式 • CV_CHAIN_APPROX_SIMPLE - 压缩水平、垂直和对角分割,即函数只保留末端的象素 点; • CV_CHAIN_APPROX_TC89_L1, CV_CHAIN_APPROX_TC89_KCOS - 应用 Teh-Chin 链逼近算法. • CV_LINK_RUNS - 通过连接为 1 的水平碎片使用完全不同的轮廓提取算法。仅有 CV_RETR_LIST 提取模式可以在本方法中应用. • offset:每一个轮廓点的偏移量. 当轮廓是从图像 ROI 中提取出来的时候,使用偏移量有用,因为可以从整个图像上下文来对轮廓做分析. • 返回值有三个,第一个是图像,第二个是轮廓,第三个是(轮廓的)层析结构。 轮廓(第二个返回值)是一个 Python 列表,其中存储这图像中的所有轮廓。 每一个轮廓都是一个 Numpy 数组,包含对象边界点(x,y)的坐标。 """ contours, hierarchy= cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) for i, contour in enumerate(contours): # 函数 cv2.drawContours() 可以被用来绘制轮廓。它可以根据你提供的边界点绘制任何形状。 # 它的第一个参数是原始图像,第二个参数是轮廓,一个 Python 列表。 # 第三个参数是轮廓的索引(在绘制独立轮廓是很有用,当设 置为 -1 时绘制所有轮廓)。 # 接下来的参数是轮廓的颜色和厚度等。 cv.drawContours(image, contours, i, (0, 0, 255), 2) # 2为像素大小,-1时填充轮廓 print(i) cv.imshow("detect contours", image)def main(): src = cv.imread("../images/circle.png") # cv.imshow("demo",src) contours_demo(src) cv.waitKey(0) # 等有键输入或者1000ms后自动将窗口消除,0表示只用键输入结束窗口 cv.destroyAllWindows() # 关闭所有窗口if __name__ == '__main__': main()

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。