import cv2
import numpy as np
from matplotlib import pyplot as plt
__author__ = "zxsuperstar"
__email__ = "zxsuperstar@163.com"
"""
Opencv3 cv2.findContours 轮廓检测
第一个参数是寻找轮廓的图像;
第二个参数表示轮廓的检索模式,有四种:
cv2.RETR_EXTERNAL表示只检测外轮廓
cv2.RETR_LIST检测的轮廓不建立等级关系
cv2.RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。
如果内孔内还有一个连通物体,这个物体的边界也在顶层。
cv2.RETR_TREE建立一个等级树结构的轮廓。
第三个参数method为轮廓的近似办法
cv2.CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1,
即max(abs(x1-x2),abs(y2-y1))==1
cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,
只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法
cv2.findContours()函数返回三个值,一个是轮廓本身,还有一个是每条轮廓对应的属性。
"""
def contours_demo(image):
dst = cv2.GaussianBlur(image,(3,3),0)
gray = cv2.cvtColor(dst,cv2.COLOR_BGRA2GRAY)
ret, binary = cv2.threshold(gray,0,255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)
cv2.imshow("binary",binary)
#cloneimage 显示图像和binary原图一样
cloneimage,contours,heriachy = cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cv2.imshow("cloneimage", cloneimage)
for i,contour in enumerate(contours):
#函数cv2.drawContours()被用来绘制轮廓。
# 第一个参数是一张图片,可以是原图或者其他。
# 第二个参数是轮廓,也可以说是cv2.findContours()找出来的点集,一个列表。
# 第三个参数是对轮廓(第二个参数)的索引,当需要绘制独立轮廓时很有用,若要全部绘制可设为-1。
# 接下来的参数是轮廓的颜色和厚度。
print(i)
cv2.drawContours(image,contours,i,(0,0,255),2)
cv2.imshow("detect contours",image)
if __name__ == "__main__":
src = cv2.imread("fp2.jpg") #blue green red
# cv2.namedWindow("image", cv2.WINDOW_AUTOSIZE)
# cv2.namedWindow('image', cv2.WINDOW_NORMAL)
# cv2.imshow("image",image)
img = cv2.resize(src, (0, 0), fx=0.25, fy=0.25, interpolation=cv2.INTER_NEAREST)
h,w,_ = img.shape
print(img.shape)
image = img[20:h - 20, 20:w - 20]
print(image.shape)
cv2.imshow("image",image)
contours_demo(image)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果: