从OpenMV到OpenCV:工创赛智能物流小车视觉方案选型避坑与实战代码分享
在机器人竞赛的赛场上,视觉系统往往决定着智能小车的"智商上限"。参加过三届工创赛的老队员都清楚,从物料识别到二维码扫描,从色环定位到动态码垛,每一个环节都可能成为翻车现场。本文将分享一套经过省赛、国赛验证的视觉方案选型思路,以及那些用时间和汗水换来的实战经验。
1. 视觉硬件选型:从参数表到实战表现
1.1 主摄像头:广角与曝光的平衡术
轮趣C100和花雀广角摄像头是我们测试过的十余款设备中脱颖而出的选手。参数表往往只能说明部分问题:
| 关键指标 | 轮趣C1080P | 花雀200万广角 | 普通USB摄像头 |
|---|---|---|---|
| 视角范围 | 92度 | 130度 | 78度 |
| 最低照度 | 0.5lux | 0.3lux | 1.0lux |
| 曝光控制 | 自适应 | 手动/自动 | 固定 |
| 抗频闪能力 | 优秀 | 良好 | 无 |
| 帧率(1080P) | 30fps | 25fps | 15fps |
实际测试中发现,广角镜头带来的边缘畸变需要通过OpenCV的校正矩阵来补偿。这段代码可以快速评估摄像头畸变程度:
python复制import cv2
import numpy as np
def check_distortion(cam_index):
cap = cv2.VideoCapture(cam_index)
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 使用棋盘格进行标定
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
objp = np.zeros((6*9,3), np.float32)
objp[:,:2] = np.mgrid[0:9,0:6].T.reshape(-1,2)
objpoints = []
imgpoints = []
ret, corners = cv2.findChessboardCorners(gray, (9,6), None)
if ret:
corners2 = cv2.cornerSubPix(gray,corners, (11,11), (-1,-1), criteria)
imgpoints.append(corners2)
objpoints.append(objp)
# 计算畸变参数
ret, mtx, dist, rve
