题目:机器人视觉全自动测量要求:根据待测刹车盘零件上线纹尺的刻度单位:毫米标定出成像测量系统的像素当量值。然后编写OpenCV程序测量:1刹车盘零件上7个小孔的直径;2各相邻孔之间的距离;3外围6个小孔中心所在圆周的直径。请输出基于opencv47的程序实例
由于没有待测刹车盘零件的图片,以下程序仅为伪代码,仅供参考。
- 标定像素当量值
import cv2
读取标定板图片
img = cv2.imread('calibration_board.jpg')
定义标定板角点数量
rows = 9 cols = 6
提取标定板角点
ret, corners = cv2.findChessboardCorners(img, (rows, cols), None)
标定相机
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera([objpoints], [corners], img.shape[::-1], None, None)
计算像素当量值
pixel_per_mm = 0 for i in range(len(corners)-1): pixel_per_mm += cv2.norm(corners[i+1]-corners[i]) pixel_per_mm /= (len(corners)-1)
- 测量小孔直径和相邻孔距离
读取待测图片
img = cv2.imread('brake_disk.jpg')
转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
阈值分割
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
轮廓检测
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
遍历轮廓
for cnt in contours: # 过滤面积过小的轮廓 area = cv2.contourArea(cnt) if area < 100: continue # 拟合圆形 (x, y), radius = cv2.minEnclosingCircle(cnt) center = (int(x), int(y)) radius = int(radius) # 绘制圆形 cv2.circle(img, center, radius, (0, 255, 0), 2) # 计算直径和距离 diameter = radius * 2 / pixel_per_mm if diameter > 1 and diameter < 5: print("小孔直径:", diameter) elif diameter > 6 and diameter < 10: print("相邻孔距离:", diameter)
- 测量圆周直径
读取待测图片
img = cv2.imread('brake_disk.jpg')
转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
阈值分割
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
轮廓检测
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
遍历轮廓
for cnt in contours: # 过滤面积过小的轮廓 area = cv2.contourArea(cnt) if area < 100: continue # 拟合圆形 (x, y), radius = cv2.minEnclosingCircle(cnt) center = (int(x), int(y)) radius = int(radius) # 绘制圆形 cv2.circle(img, center, radius, (0, 255, 0), 2) # 计算圆周直径 if radius > 50 and radius < 60: diameter = radius * 2 / pixel_per_mm print("圆周直径:", diameter)
原文地址: https://www.cveoy.top/t/topic/bKR7 著作权归作者所有。请勿转载和采集!