1. 双目视觉定位系统概述
在工业自动化和机器人应用领域,双目相机系统因其能够获取目标物体的三维空间信息而成为关键技术。这套系统通过模拟人类双眼视差原理,利用两个水平放置的摄像头从不同角度采集图像,经过图像处理和立体匹配算法,计算出目标物体相对于相机坐标系的三维位置坐标(X,Y,Z)。这种非接触式测量方式特别适合需要精确定位的自动化抓取场景。
典型的双目视觉定位系统由以下几个核心组件构成:
- 双目摄像头模组(通常采用全局快门CMOS传感器)
- 图像处理单元(如Intel RealSense SDK或ZED相机配套软件)
- 机械臂控制接口(常见的有Modbus TCP或EtherCAT协议)
- 手眼标定模块(用于建立相机坐标系与机械臂基坐标系的转换关系)
关键提示:在实际部署时,建议选择基线距离(两个摄像头中心间距)在60-120mm之间的双目相机,这个范围既能保证足够的深度测量精度,又不会因为基线过长导致近处物体的视差匹配困难。
2. 相机标定与三维重建
2.1 相机内参标定
双目系统的标定分为内参标定和外参标定两个部分。内参标定使用OpenCV的cv2.calibrateCamera()函数处理棋盘格标定板的拍摄图像,获取每个相机的固有参数:
python复制import cv2
import numpy as np
# 准备标定板参数
pattern_size = (9, 6) # 棋盘格内角点数量
square_size = 0.025 # 每个方格的实际物理尺寸(米)
# 检测角点
obj_points = [] # 3D点(世界坐标系)
img_points = [] # 2D点(图像坐标系)
# 生成标定板3D坐标
objp = np.zeros((pattern_size[0]*pattern_size[1], 3), np.float32)
objp[:,:2] = np.mgrid[0:pattern_size[0], 0:pattern_size[1]].T.reshape(-1,2) * square_size
# 遍历标定图像
for fname in calibration_images:
img = cv2.imread(fname)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 查找角点
ret, corners = cv2.findChessboardCorners(gray, pattern_size, None)
if ret:
obj_points.append(objp)
corners_refined = cv2.cornerSubPix(gray, corners, (11,11), (-1,-1),
(cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001))
img_points.append(corners_refined)
# 相机标定
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(
obj_points, img_points, gray.shape[::-1], None, None)
标定完成后,我们需要保存以下关键参数:
- 相机矩阵(camera matrix):包含焦距(fx,fy)和光学中心(cx,cy)
- 畸变系数(distortion coefficients):k1,k2,p1,p2,k3
- 立体标定参数:两个相
