以下是一个基于OpenCV的实时零件尺寸检测Python实例代码,结合摄像头捕捉和图像处理技术实现尺寸检测。代码中包含详细的注释说明和实际应用要点。
import cv2
import numpy as np
# 初始化摄像头
cap = cv2.VideoCapture(0)
# 设置参考物实际尺寸(示例为A4纸的短边21cm)
ref_width_cm = 21.0
min_width = 19.5 # 最小合格尺寸
max_width = 21.5 # 最大合格尺寸
def get_pixel_ratio(frame):
"""通过参考物计算像素/厘米比例"""
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
edged = cv2.Canny(blurred, 50, 200)
# 寻找最大轮廓
contours, _ = cv2.findContours(edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
if len(contours) > 0:
max_contour = max(contours, key=cv2.contourArea)
x, y, w, h = cv2.boundingRect(max_contour)
return w / ref_width_cm # 像素/厘米
return None
while True:
ret, frame = cap.read()
if not ret:
break
# 获取当前像素比例
pixel_ratio = get_pixel_ratio(frame)
if pixel_ratio is not None:
# 预处理
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
edged = cv2.Canny(blurred, 50, 200)
# 检测零件轮廓
contours, _ = cv2.findContours(edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
area = cv2.contourArea(cnt)
if area > 1000: # 过滤小噪点
# 获取旋转矩形
rect = cv2.minAreaRect(cnt)
(x, y), (w, h), angle = rect
# 计算实际尺寸
width_cm = max(w, h) / pixel_ratio
height_cm = min(w, h) / pixel_ratio
# 判断是否合格
color = (0, 255, 0) if (min_width <= width_cm <= max_width) else (0, 0, 255)
# 绘制检测结果
box = cv2.boxPoints(rect)
box = np.int0(box)
cv2.drawContours(frame, [box], 0, color, 2)
cv2.putText(frame, f"W:{width_cm:.1f}cm", (int(x)-50, int(y)-20),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,0,0), 2)
cv2.imshow('Detection', frame)
if cv2.waitKey(1) == 27: # ESC退出
break
cap.release()
cv2.destroyAllWindows()
关键实现要点说明:
参考物校准:通过A4纸等已知尺寸物体建立像素与实际尺寸的换算关系,这是实现精确测量的基础
图像预处理流程:
高斯模糊消除噪声(GaussianBlur)
Canny边缘检测获取零件轮廓(Canny)
形态学操作优化边缘质量(示例中未展示,可添加膨胀/腐蚀操作)
轮廓分析技术:
使用findContours获取候选轮廓
minAreaRect获取最小外接旋转矩形
面积过滤排除噪声干扰
实时检测优化:
保持30fps以上的处理速度
使用绿色/红色边框直观显示检测结果
显示实时尺寸数值
扩展改进建议:
增加稳定性措施:
# 在获取像素比例处添加移动平均滤波
ratio_buffer = []
def get_pixel_ratio(frame):
... # 原有代码
if len(ratio_buffer) > 10:
ratio_buffer.pop(0)
ratio_buffer.append(current_ratio)
return np.mean(ratio_buffer)
光照补偿处理:
clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(8,8))
gray = clahe.apply(gray)
数据库集成(需配合SQLite等数据库):
数据库集成(需配合SQLite等数据库):
import sqlite3
def save_result(measurement):
conn = sqlite3.connect('quality.db')
c = conn.cursor()
c.execute('''INSERT INTO records VALUES (?, ?, datetime('now'))''',
(measurement['width'], measurement['status']))
conn.commit()
注意事项:
摄像头应垂直正对检测平面,推荐使用固定支架
参考物与零件需处于相同焦平面
建议使用环形光源消除阴影干扰
定期用标准量具校准系统精度
该方案结合了机器视觉的常见检测方法,通过实时视频流处理实现自动化检测,可扩展应用于工业质检场景。实际部署时需根据具体零件特征调整预处理参数和判定阈值。