图形检测
2025-12-09 16:13:06 0 举报
AI智能生成
有关于opencv的图形检测
作者其他创作
大纲/内容
图像的轮廓
含义
图像中图形或物体的外边缘线条
语法
contours, hierarchy = cv2.findContours(image, mode, method)
image: 必须为 8 位单通道二值图像;彩色图像需先转灰度图并二值化
mode:常用值:
cv2.RETR_EXTERNAL:仅检测外轮廓
cv2.RETR_LIST:检测所有轮廓,不建立层次
cv2.RETR_CCOMP:检测所有轮廓,建立两级层次
cv2.RETR_EXTERNAL:仅检测外轮廓
cv2.RETR_LIST:检测所有轮廓,不建立层次
cv2.RETR_CCOMP:检测所有轮廓,建立两级层次
method:cv2.CHAIN_APPROX_NONE:存储轮廓所有点
cv2.CHAIN_APPROX_SIMPLE:仅保存水平 / 垂直 / 对角线轮廓端点
cv2.CHAIN_APPROX_SIMPLE:仅保存水平 / 垂直 / 对角线轮廓端点
补充
用法是检测轮廓,绘制轮廓之前,必要可以进行滤波
轮廓拟合
含义
将凹凸不
平的轮廓用平整的几何图形体现出来
平的轮廓用平整的几何图形体现出来
常见语法
矩形包围框
x, y, w, h = cv2.boundingRect(array)
array:contours 中的某轮廓数组;
返回值:x(左上角横坐标)、y(左上角纵坐标)、w(矩形宽度)、h(矩形高
度)
返回值:x(左上角横坐标)、y(左上角纵坐标)、w(矩形宽度)、h(矩形高
度)
示例:x, y, w, h = cv2.boundingRect(contours[0])
cv2.rectangle(img, (x,y), (x+w,y+h), (0,0,255), 2)
cv2.rectangle(img, (x,y), (x+w,y+h), (0,0,255), 2)
圆形包围框
center, radius = cv2.minEnclosingCircle(points)
points:contours 中的某轮廓数组;
返回值:center(圆心坐标,浮点型)、radius(半径,浮点型)
返回值:center(圆心坐标,浮点型)、radius(半径,浮点型)
center, radius = cv2.minEnclosingCircle(contours[0])
x = int(round(center[0]))
y = int(round(center[1]))
cv2.circle(img, (x,y), int(radius), (0,0,255), 2)
x = int(round(center[0]))
y = int(round(center[1]))
cv2.circle(img, (x,y), int(radius), (0,0,255), 2)
补充
在使用包围框语法前加上图像的轮廓的语法
凸包
含义
找出图形最外层的端
点,将这些端点连接起来,就可 以围出一个包围图形的最小包围框
点,将这些端点连接起来,就可 以围出一个包围图形的最小包围框
语法
hull = cv2.convexHull(points, clockwise, returnPoints)
points : 轮廓数组
clockwise:当该值为 True 时,凸包中 的点按顺时针排列,为 False
时按逆时针排列。
时按逆时针排列。
returnPoints:当该值为 True 时返回 点坐标,为 False 时返回点索
引。默认值为 True。
引。默认值为 True。
hull = cv2.convexHull(contours[0])
cv2.polylines(img, [hull], True, (0,0,255), 2) #绘制一个轮廓
cv2.polylines(img, [hull], True, (0,0,255), 2) #绘制一个轮廓
补充
clockwise,returnPoints如果不填写也可以
Canny边缘检测
含义
绘 制十分精细的二值边缘图像
语法
edges = cv2.Canny(image, threshold1, threshold2, apertureSize, L2gradient)
image:检测的原始图像
threshold1:通
常用来设置最小阈值。
常用来设置最小阈值。
threshold2:通常用来设置 最大阈值。
r1 = cv2.Canny(img, 10, 50)
补充
阈值选用合理,太小图像太密,太大图像简单
霍夫变换
含义
通过算法识别图像的特征,从而判断图 像中的特殊形状
语法
直线检测
lines = cv2.HoughLinesP(image, rho, theta, threshold, minLineLength, maxLineGap)
rho:检测直线使用的半径步长,值为 1 时,表示检测所有可 能的半径长。
theta:值为 π/180°时,表示检测所有角 度。
threshold:值越小,检测出的直线就越多。
minLineLength:线段的最小长度,小于该长度的线段不记 录到结果中
maxLineGap:线段之间的最小距离
lines = cv2.HoughLinesP(binary, 1, np.pi/180, 15, minLineLength=100, maxLineGap=18)
圆环检测
circles = cv2.HoughCircles(image, method, dp, minDist, param1, param2, minRadius,
maxRadius)
maxRadius)
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 70, param1=100, param2=25, minRadius=10, maxRadius=50)
补充
直线检测
直线:[ [[x1,y1,x2,y2]], [[x1,y1,x2,y2]], ... ]
for line in lines:
x1, y1, x2, y2 = line[0]
cv2.line(img, (x1,y1), (x2,y2), (0,0,255), 2)
x1, y1, x2, y2 = line[0]
cv2.line(img, (x1,y1), (x2,y2), (0,0,255), 2)
圆环检测
圆:[ [[x1,y1,r1], [x2,y2,r2], ...] ]
for c in circles[0]:
x, y, r = c
cv2.circle(img, (x,y), r, (0,0,255), 3) #绘制圆环
cv2.circle(img, (x,y), 2, (0,0,255), 3) #绘制圆心
x, y, r = c
cv2.circle(img, (x,y), r, (0,0,255), 3) #绘制圆环
cv2.circle(img, (x,y), 2, (0,0,255), 3) #绘制圆心
收藏
收藏
0 条评论
下一页