具有相同颜色或者强度的连续点的曲线;
(1)图像的分析;
(2)物体的识别与检测
注:为了检测的准确性,首先需要将图像进行二值化或者Canny(边缘检测)
画轮廓时会修改输入的图像,所以需要进行深度拷贝;
findContours(image, mode, method, contours=None, hierarchy=None, offset=None)
:
Img:输入的原始图像
;
Mode:使用的模式,一般使用RETR_LIST或者RETR_TREE
;
Method:采用的近似模式
;
Contours:向量内每个元素保存了一组由连续的Point点构成的点的集合的向量.(vector
.
Hierarchy:定义了一个“向量内每一个元素包含了4个int型变量”的向量(vector
.
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:只保存角点;
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
这样的话就很多了,因为图中的轮库很多,以树形的方式存储并输出轮库的角点就很多。
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:将所有绘制的轮廓移动指定的量
。
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()