栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Opencv中的findContours()和drawContours()(python实现)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Opencv中的findContours()和drawContours()(python实现)

文章目录
    • 1.图像轮廓
    • 2.轮廓的作用
    • 3.函数讲解
    • 4.代码实战
    • 5.画出轮廓
      • (1)函数讲解
      • (2)代码实战

1.图像轮廓

具有相同颜色或者强度的连续点的曲线;


2.轮廓的作用

(1)图像的分析;
(2)物体的识别与检测
注:为了检测的准确性,首先需要将图像进行二值化或者Canny(边缘检测)
画轮廓时会修改输入的图像,所以需要进行深度拷贝;


3.函数讲解

findContours(image, mode, method, contours=None, hierarchy=None, offset=None):

Img:输入的原始图像;
Mode:使用的模式,一般使用RETR_LIST或者RETR_TREE;
Method:采用的近似模式;
Contours:向量内每个元素保存了一组由连续的Point点构成的点的集合的向量.(vector> contours).
Hierarchy:定义了一个“向量内每一个元素包含了4个int型变量”的向量(vector hierarchy).
Offset:Point偏移量,所有的轮廓信息相对于原始图像对应点的偏移量,相当于在每一个检测出的轮廓点上加上该偏移量,并且Point还可以是负值.

函数返回值:Contours和Hierarchy
mode的方式;
(1)RETR_EXTERNAL=0:表示只检测外轮廓;
(2)RETR_LIST=1:检测的轮廓不建立等级关系;
(3)RETR_CCOMP=2:每层最多两层;
(4)RETR_TREE:按树形存储轮廓;
Method的模式(最常用的两种):
(1)CHAIN_APPROX_NONE:保存所有轮廓上的点;
(2)CHAIN_APPROX_SIMPLE:只保存角点;


4.代码实战
import os
import cv2
import numpy as np

def FindContours(img_path='images/external.png'):
    #读取图像
    img_src=cv2.imread(img_path)
    img_src=cv2.resize(src=img_src,dsize=(450,450))
    #图像灰度化
    img=cv2.cvtColor(src=img_src,code=cv2.COLOR_BGR2GRAY)
    # print(img.shape)
    #图像二值化
    ret,img_binary=cv2.threshold(src=img,thresh=150,maxval=255,type=cv2.THRESH_BINARY)
    contours,hierarchy=cv2.findContours(image=img_binary,mode=cv2.RETR_EXTERNAL,method=cv2.CHAIN_APPROX_SIMPLE)
    #打印出轮廓列表
    print("contours: {}".format(contours))

    #显示图片
    cv2.imshow('img_src',img_src)
    cv2.imshow('img_binary',img_binary)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == '__main__':
    print('PyCharm')
    FindContours()


打印出的轮廓列表

如果将mode=cv2.RETR_EXTERNAL换成是mode=cv2.RETR_TREE


这样的话就很多了,因为图中的轮库很多,以树形的方式存储并输出轮库的角点就很多。


5.画出轮廓 (1)函数讲解

drawContours(image, contours, contourIdx, color, thickness=None, lineType=None, hierarchy=None, maxLevel=None, offset=None):

Image:输入原始的图像;
Contours:坐标点(这个根据查找轮廓函数即可得到);
contourIdx;设置轮廓的顺序号;-1表示绘制所有的轮廓;
Color:绘制使用的颜色;
Thickness:绘制使用的线宽;-1表示全部填充;
lineType:绘制使用的线类型;
Hierarchy:设置层级;
maxLevel:如果为0,则仅绘制指定的轮廓。
如果为1,则函数将绘制轮廓和所有嵌套轮廓。如果为2,则函数绘制等高线、所有嵌套等高线、所有嵌套到嵌套等高线,等等。这仅当存在可用的层次结构时,才考虑参数。
Offset:将所有绘制的轮廓移动指定的量。

(2)代码实战
import os
import cv2
import numpy as np

def FindContours(img_path='images/external.png'):
    #读取图像
    img_src=cv2.imread(img_path)
    img_src=cv2.resize(src=img_src,dsize=(450,450))
    #图像灰度化
    img=cv2.cvtColor(src=img_src,code=cv2.COLOR_BGR2GRAY)
    # print(img.shape)
    #图像二值化
    ret,img_binary=cv2.threshold(src=img,thresh=150,maxval=255,type=cv2.THRESH_BINARY)
    contours,hierarchy=cv2.findContours(image=img_binary,mode=cv2.RETR_TREE,method=cv2.CHAIN_APPROX_SIMPLE)
    #打印出轮廓列表
    print("contours: {}".format(contours))
    #绘制轮廓
    dst=cv2.drawContours(image=img_src,contours=contours,contourIdx=-1,color=(0,255,0),thickness=1)

    #显示图片
    # cv2.imshow('img_src',img_src)
    cv2.imshow('dst',dst)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == '__main__':
    print('PyCharm')
    FindContours()


当contourIdx=0时,只画出外围轮廓:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/979781.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号