6台鱼眼相机360度拼接时单应性矩阵计算后图像变形问题求助
6台鱼眼相机360全景拼接故障排查与修复
核心问题定位
- 图像缩放参数错误:对右图执行resize时设置fx=0.5、fy=0.3,人为改变了图像纵横比,导致关键点坐标与实际几何关系不匹配,计算出的单应性矩阵完全偏离正确值
- 透视变换输出画布尺寸计算错误:当前仅设置输出宽度为两张图宽度之和,未考虑单应性矩阵可能存在的负偏移,变换后的右图内容会直接落在画布外,出现内容丢失
- 平面透视拼接不适用于大视场场景:鱼眼去畸变后相邻图像视场重叠区域大,直接用平面单应性变换会导致远离匹配点的区域出现严重透视变形,360全景场景更适合先做柱面投影再拼接
- 已有标定参数未被利用:你已经完成相机标定获取了内外参,静态安装的相机外参固定,可直接通过外参计算单应性矩阵,稳定性远高于动态特征匹配
修复方案
1 修复图像缩放逻辑
将不等比例缩放改为等比例缩放,保证图像纵横比不变:
# 统一按0.5倍等比例缩放,纵横比不变 scale = 0.5 img_right = cv2.resize(img_right, None, fx=scale, fy=scale) # 左图缩放到和右图相同尺寸 img_left = cv2.resize(img_left, (img_right.shape[1], img_right.shape[0]))
2 修正透视变换画布计算逻辑
计算单应性矩阵后,先预判右图四个角点变换后的坐标范围,调整画布尺寸并增加偏移量,保证所有内容都落在画布内:
# 计算右图四个角点变换后的坐标 h_right, w_right = img_right.shape[:2] corners_right = np.float32([[0,0], [0,h_right], [w_right,h_right], [w_right,0]]).reshape(-1,1,2) corners_transformed = cv2.perspectiveTransform(corners_right, H) # 计算画布的上下左右边界 x_min = min(np.min(corners_transformed[:,:,0]), 0) x_max = max(np.max(corners_transformed[:,:,0]), img_left.shape[1]) y_min = min(np.min(corners_transformed[:,:,1]), 0) y_max = max(np.max(corners_transformed[:,:,1]), img_left.shape[0]) # 计算偏移量,把所有内容移到正坐标系 offset_x = int(-x_min) offset_y = int(-y_min) # 调整单应性矩阵,增加偏移 H_offset = np.array([[H[0,0], H[0,1], H[0,2]+offset_x], [H[1,0], H[1,1], H[1,2]+offset_y], [H[2,0], H[2,1], H[2,2]]]) # 生成适配尺寸的新画布 result = cv2.warpPerspective(img_right, H_offset, (int(x_max-x_min), int(y_max-y_min))) # 左图叠加偏移后粘贴到对应位置 result[offset_y:offset_y+img_left.shape[0], offset_x:offset_x+img_left.shape[1]] = img_left
3 可选优化:增加柱面投影
360全景拼接建议先将去畸变的平面图像转为柱面投影,再执行特征匹配拼接,可大幅减少透视变形:
def cylindrical_projection(img, K): # K为对应相机的内参矩阵 h, w = img.shape[:2] # 生成像素坐标网格 u, v = np.meshgrid(np.arange(w), np.arange(h)) # 像素坐标转相机归一化坐标 x = (u - K[0,2]) / K[0,0] y = (v - K[1,2]) / K[1,1] # 柱面投影转换 theta = np.arctan(x) h_cyl = y / np.sqrt(x**2 + 1) # 柱面坐标转回像素坐标 u_cyl = K[0,0] * theta + K[0,2] v_cyl = K[1,1] * h_cyl + K[1,2] # 重映射生成柱面投影图 map_x = u_cyl.astype(np.float32) map_y = v_cyl.astype(np.float32) return cv2.remap(img, map_x, map_y, cv2.INTER_LINEAR)
4 长期稳定方案:利用标定外参计算单应性
静态安装的相机不需要每次都做特征匹配,直接通过两张图像的外参矩阵计算单应性即可,稳定性和准确率远高于SIFT匹配,计算式为H = K1 @ R1 @ np.linalg.inv(R2) @ np.linalg.inv(K2),其中R1、R2为两个相机的旋转外参,K1、K2为对应相机的内参。
内容的提问来源于stack exchange,提问作者compup
相关产品推荐
相关产品推荐

