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()

Opencv中的findContours()和drawContours()(python实现)_第1张图片
打印出的轮廓列表
Opencv中的findContours()和drawContours()(python实现)_第2张图片
如果将mode=cv2.RETR_EXTERNAL换成是mode=cv2.RETR_TREE
Opencv中的findContours()和drawContours()(python实现)_第3张图片
Opencv中的findContours()和drawContours()(python实现)_第4张图片
这样的话就很多了,因为图中的轮库很多,以树形的方式存储并输出轮库的角点就很多。


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()

Opencv中的findContours()和drawContours()(python实现)_第5张图片
当contourIdx=0时,只画出外围轮廓:
Opencv中的findContours()和drawContours()(python实现)_第6张图片

你可能感兴趣的:(Opencv,opencv,python,计算机视觉)