基于轮廓发现的几何形状识别

1.轮廓

轮廓是指图像中图形或物体的外边缘线条,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:轮廓之间的层次关系

2.绘制轮廓

cv.drawContours(imgContour, cnt, -1, (0, 255, 0), 3)

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:
#             # 如果识别不出,显示圆心不存在
#

。。。。。

你可能感兴趣的:(opencv,计算机视觉,人工智能)