边缘检测和图像轮廓的区别:边缘是零散的点,轮廓是个整体
cv2.findContours(img,mode,method)
mode:轮廓检索模式
RETR_EXTERNAL:只搜索最外面的轮廓
RETR_LIST:检索所有的轮廓,并将其保存到一条链表当中
RETE_CCOMP:检索所有的轮廓,并将他们组织为两层;顶层是部分的外部边界,第二层是空洞的边界.
RETR_TREE(最常用的):检索所有的轮廓,并重构嵌套轮廓的整个层次;
method:轮廓逼近方法:
CHAIN_APPROX_NONE:以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)
CHAIN_APPROX_SIMPL:压缩水平的,垂直的和斜的部分,也就是,函数只保留他们的终点部分
代码展示:
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread(r'C:UsersmasterDesktopcar.png')
#读取图像灰度图
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#图像二值化
ret, threshold = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
#图像轮廓检测
contours, hierarchy = cv2.findContours(threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
#绘制轮廓
#传入绘制图,轮廓,轮廓索引,颜色模式,线条厚度
#注意需要copy,要不原图会变
draw_img = img.copy()
res = cv2.drawContours(draw_img, contours, -1, (0, 255,0 ), 1)
cv2.imshow('res',res)
效果展示:



