2. 核心技术与实现步骤
2.1 硬件选型关键参数
组件 |
要求 |
推荐型号示例 |
工业相机 |
全局快门、200万像素以上、帧率≥100fps |
Basler ace acA2000-165um |
镜头 |
远心镜头(避免透视畸变)或固定焦距镜头 |
Opto 0.1X 远心镜头 |
光源 |
红色/蓝色条形背光(增强对比度) |
CCS LDR2-100W |
编码器 |
1000线增量式编码器(同步触发) |
Omron E6B2-CWZ6C |
2.2 动态标定流程(应对传送带运动)
步骤1:安装参照标记
在传送带两侧固定 ArUco标记 或 激光刻线,间距已知(如500mm)。
步骤2:运动同步标定
通过编码器触发相机采集,计算标记实际位移与像素位移的比例系数:
python
# 检测ArUco标记位移
marker_pos_pixel = [cv2.aruco.estimatePoseSingleMarkers(corners, marker_length, mtx, dist)[0] for frame in frames]
displacement_pixel = np.linalg.norm(marker_pos_pixel[1] - marker_pos_pixel[0])
scale = actual_displacement_mm / displacement_pixel # 单位: mm/pixel
步骤3:运动补偿矩阵
根据传送带速度动态更新ROI区域:
python
speed_mm_per_ms = encoder_pulse * pulse_to_mm_ratio / time_interval
roi_x_offset = int(speed_mm_per_ms * frame_interval / scale)
2.3 图像处理流水线
python
def process_frame(frame):
# 1. 去运动模糊 (Wiener滤波)
kernel = cv2.getGaussianKernel(21, 5)
frame_deblur = cv2.filter2D(frame, -1, kernel)
# 2. 高对比度二值化 (自适应阈值)
gray = cv2.cvtColor(frame_deblur, cv2.COLOR_BGR2GRAY)
binary = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY_INV, 11, 2)
# 3. 多帧融合降噪
global frame_buffer
frame_buffer.append(binary)
if len(frame_buffer) > 5: # 融合5帧
fused = np.median(np.array(frame_buffer), axis=0).astype(np.uint8)
# 4. 亚像素边缘检测
edges = cv2.Canny(fused, 50, 150)
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
# 5. 形状还原
for cnt in contours:
# 亚像素优化
cnt_subpixel = cv2.cornerSubPix(gray, cnt.astype(np.float32), (3,3), (-1,-1),
(cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.01))
# 实际坐标转换
cnt_real = cnt_subpixel * scale # 直接乘标定系数
# 形状分类
if len(cv2.approxPolyDP(cnt_real, 0.02*cv2.arcLength(cnt_real, True), True)) == 4:
# 矩形测量
rect = cv2.minAreaRect(cnt_real)
width, height = rect[1][0], rect[1][1]
else:
# 不规则形状
area = cv2.contourArea(cnt_real)
2.4 实时性优化技巧
- 硬件加速:使用OpenCV的CUDA模块(
cv2.cuda.GpuMat
)处理图像
- ROI裁剪:仅处理传送带中央区域(减少计算量)
- 并行处理:Python多进程(
multiprocessing
)分离采集与处理线程