轮廓是指图像中图形或物体的外边缘线条,opencv提供的findContours()方法通过计算图像梯度来判断图像的边缘,然后将边缘的点封装成数组返回
contours, hierarchy = cv.findContours(img, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)
img:必须是8位单通道二值图像。
mode :轮廓的检索模式
cv.RETR_EXTERNAL :只检测外轮廓
cv.RETR_LIST:检测所有轮廓,但不建立层次关系
cv.RETR_CCOMP:检测所有轮廓,并建立两级层次关系
cv.RETR_TREE:检测所有轮廓,并建立树状结构的层次关系
method:
cv.CHAIN_APPROX_NONE
cv.CHAIN_APPROX_SIMPLE
cv.CHAIN_APPROX_TC89_L1
cv.CHAIN_APPROX_TC89_KCOS
返回值说明:
contours:检测出所以轮廓,list类型,每一个元素都是某个轮廓的像素坐标数组
hierarchy:轮廓之间的层次关系
cv.drawContours(imgContour, cnt, -1, (0, 255, 0), 3)
多边形逼近,是通过对轮廓外形无限逼近,删除非关键点、得到轮廓的关键点,不断逼近轮廓真实形状的方法
peri = cv.arcLength(cnt, True)
approx = cv.approxPolyDP(cnt, 0.02*peri, True)
4.如果利用轮廓查找的方式检测圆形,可以根据外接矩形的长宽比是否接近1判断,这种方法会误检测正方形,实际应用中可以再加一层筛选条件
opencv中的boundingRect()可以自动计算轮廓最小矩形边界的坐标,宽和高
retval = cv.boundingRect(array)
x, y, w, h = cv.boundingRect(approx) # 获取坐标值和宽度、高度
求出宽度和高度的比值;
(2)
peri = cv.arcLength(cnt, True)
approx = cv.approxPolyDP(cnt, 0.02*peri, True)
len(approx)求出轮廓的角点
根据角点数量可以判断出几何形状
corners = len(approx)
if corners == 3:
shape_type = "三角形"
if corners == 4:
shape_type = "矩形"
if corners >= 10:
shape_type = "圆形"
if 4 < corners < 10:
shape_type = "多边形"
5.求出轮廓面积
l= cv.arcLength(contours[cnt],True)
area = cv.contourArea(contours[cnt])
二:霍夫圆检测
# 消除噪声
# opening = cv2.morphologyEx(gray, cv2.MORPH_OPEN, kernel) # 形态学开运算
# bila = cv2.bilateralFilter(opening, 10, 200, 200) # 双边滤波消除噪声
# edges = cv2.Canny(opening, 50, 100) # 边缘识别
# # 识别圆形
# circles = cv2.HoughCircles(
# edges, cv2.HOUGH_GRADIENT, 1, 100, param1=100, param2=10, minRadius=10, maxRadius=500)
# if circles is not None: # 如果识别出圆
# for circle in circles[0]:
# # 获取圆的坐标与半径
# x = int(circle[0])
# y = int(circle[1])
# r = int(circle[2])
# cv2.circle(frame, (x, y), r, (0, 0, 255), 3) # 标记圆
# cv2.circle(frame, (x, y), 3, (255, 255, 0), -1) # 标记圆心
# text = 'x: ' + str(x) + ' y: ' + str(y)
# cv2.putText(frame, text, (10, 30), font, 1, (0, 255, 0), 2, cv2.LINE_AA, 0) # 显示圆心位置
# else:
# # 如果识别不出,显示圆心不存在
#
。。。。。