轮廓检测
轮廓是具有相同色彩或者灰度的曲线,在形状分析和物体检测中具有很重要的作用。
API详解
cv2.findContours()
cv2.findContours() 函数查找轮廓,:第一个参数为输入图像;第二个参数为轮廓的检索模式,cv2.RETR_TREE会得到图像中轮廓的整体层次结构,建立轮廓之间的关系;
cv2.RETR_EXTERNAL得到最外面的轮廓,消除轮廓之内的轮廓。
第三个是轮廓的近似方法,cv2.CHAIN_APPROX_NONE存储边界上的所有点;cv2.CHAIN_APPROX_SIMPLE只存储边界线的端点,去掉了轮廓上的冗余点,节省内存开支。
两个返回值,第一个是轮廓(列表形式), 第二个是轮廓的层析结构。
cv2.drawContours()
cv2.drawContours()绘制轮廓: 第一个参数为原始图像,第二个参数为轮廓(列表),第三个参数为轮廓的索引(在绘制独立轮廓时使用, -1 表示绘制所有轮廓),第四个参数为轮廓的颜色, 第五个参数为线宽。
cv2.boundingRect()
cv2.boundingRect()得到一个直矩形,返回值为直矩形的起点坐标x,y 和矩形的w,h 。
cv2.minAreaRect()
cv2.minAreaRect()得到旋转矩形,返回值为矩形的中心坐标(x, y),(w,h), 旋转角度(角度范围在[-90, 0])。
cv2.boxPoints()
cv2.boxPoints()返回矩形的四个顶点坐标,坐标为浮点型,需要转换为整型。
cv2.minEnclosingCircle()
cv2.minEnclosingCircle()得到最小外接圆,返回圆心坐标和半径,也需要进行浮点型转换为整型 。
cv2.fitEllipse()
椭圆拟合 :cv2.fitEllipse()输入的点集至少包含六个点,返回值为椭圆的中心坐标、长短轴径、旋转角度。
代码
import cv2
import numpy as np
src = cv2.imread(r'F:\OPENCV\Opencv\test2.png', cv2.IMREAD_COLOR)
img = src.copy()
if src is None:
print('image is null')
blur = cv2.medianBlur(src, 5)
gray = cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY)
# cv2.findContours()查找轮廓,输入图像为黑底的二值图
contours, hierarchy = cv2.findContours(~thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
img = src.copy()
img = cv2.drawContours(img, contours, -1, (0, 0, 255), 2)
cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.imshow('img', img)
dst = src.copy()
for contour in contours:
# 直矩形
x, y, w, h = cv2.boundingRect(contour)
cv2.rectangle(dst, (x, y), (x + w, y + h), (255, 0, 0), 2)
# 旋转矩形(最小外接矩形)
rect = cv2.minAreaRect(contour)
box = cv2.boxPoints(rect)
box = np.int0(box)
cv2.drawContours(dst, [box], 0, (0, 255, 0), 2)
# 最小外接圆
(x, y), radius = cv2.minEnclosingCircle(contour)
center = (int(x), int(y))
radius = int(radius)
cv2.circle(dst, center, radius, (0, 0, 255), 2)
# 椭圆拟合
ellipse = cv2.fitEllipse(contours[0])
cv2.ellipse(dst, ellipse, (255, 0, 0), 2)
cv2.namedWindow('dst', cv2.WINDOW_NORMAL)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()
结果显示
参考
1.OpenCV-Python官方教程
2.OpenCV3计算机视觉