基于opencv-python计算低角度拍摄下已知平台上物体(x,y)坐标
低角度拍摄下平台物体坐标计算实现方案
核心问题说明
你此前透视变换出现物体过度放大的根本原因是:单应性矩阵(透视变换的映射参数)仅对平台平面上的点有效,物体顶面属于平面外的点,直接对全图做透视变换会把平面外的像素按平面映射规则拉伸,导致畸变。
方案一:单应性矩阵映射法(精度最高)
前置准备
- 提前标定平台四个角点的图像像素坐标和对应的实际物理坐标(原点为平台左上角,单位和你已知的平台尺寸一致即可)
- 调用OpenCV的
findHomography()接口,传入两组坐标计算得到单应性矩阵H,该矩阵仅适用于平台平面上的点的映射
坐标计算步骤
- 对Otsu阈值得到的物体掩码,提取最小外接矩形,取矩形底边中点的像素坐标
(px, py):该点位于物体和平台的接触面上,属于平台平面上的点,无高度带来的透视误差 - 调用
perspectiveTransform()接口,传入H和像素点(px, py),直接输出对应的平台物理坐标(x, y)
方案二:比例映射法(实现简单,无需矩阵运算)
前置准备
- 拟合平台四条边的直线方程:左边界
L_left、右边界L_right、上边界L_top、下边界L_bottom
坐标计算步骤
- 同样取物体检测框底边中点
(px, py) - 计算x坐标:过
(px, py)做水平线,和L_left、L_right分别交于点p_left、p_right,x方向比例为(px - p_left.x) / (p_right.x - p_left.x),乘以平台实际物理宽度得到x坐标 - 计算y坐标:过
(px, py)做平行于平台左右边界的直线,和L_top、L_bottom分别交于点p_top、p_bottom,y方向比例为(py - p_top.y) / (p_bottom.y - p_top.y),乘以平台实际物理高度得到y坐标
原有透视变换方案的修复方法
如果要继续使用透视变换后的鸟瞰图做后续处理,仅对平台区域的像素做warpPerspective变换,物体坐标仅取变换后物体和平台接触的边缘点计算,不要使用整个物体检测框的坐标,即可避免过度放大的误差。
内容的提问来源于stack exchange,提问作者pained_coder
相关产品推荐
相关产品推荐

