[英]How to get Bird's Eye View from KITTI by Projection Matrix?
目标是从 KITTI 图像(数据集)中获得鸟瞰图,并且我有投影矩阵(3x4)。
有很多方法可以生成变换矩阵。 对于鸟瞰图,我已经阅读了一些数学表达式,例如:
H12 = H2*H1-1=A R A-1=P*A-1 in OpenCV - 投影、单应矩阵和鸟瞰图
和 x = Pi * Tr * X 在kitti 数据集相机投影矩阵中
但这些选项都不适用于我的目的。
导入 numpy 作为 np 导入 cv2
image = cv2.imread('数据/RGB/000007.png')
最大高度,最大宽度 = image.shape[:2]
M = np.array(([721.5377, 0.0, 609.5593, 44.85728], [0.0, 721.5377, 72.854, 0.2163791], [0.0, 0.0, 1.0, .002745884]))
warped = cv2.warpPerspective(图像, M, (maxWidth, maxHeight))
cv2.imshow("原始", 图片)
cv2.imshow("扭曲", 扭曲)
cv2.waitKey(0)
我需要知道如何管理投影矩阵以获得鸟瞰图。
到目前为止,我尝试过的所有事情都会向我抛出扭曲的图像,甚至没有接近我需要的信息。
在左侧,图像显示在 3D(上)和 2D(下)中检测汽车。 右边是我想要获得的鸟瞰图。 因此,我需要获取变换矩阵来变换分隔汽车的框的坐标。
这是我手动构建鸟瞰图变换的代码:
cv::Mat1d CameraModel::getInversePerspectiveMapping(double pixelPerMeter, cv::Point const & origin) const {
double f = pixelPerMeter * cameraPosition()[2];
cv::Mat1d R(3,3);
R << 0, 1, 0,
1, 0, 0,
0, 0, 1;
cv::Mat1d K(3,3);
K << f, 0, origin.x,
0, f, origin.y,
0, 0, 1;
cv::Mat1d transformtoGround = K * R * mCameraToCarMatrix(cv::Range(0,3), cv::Range(0,3));
return transformtoGround * mIntrinsicMatrix.inv();
}
函数内部使用的成员变量/函数是
mCameraToCarMatrix
:一个 4x4 矩阵,包含从相机坐标系到汽车坐标系的齐次刚性变换。 相机的轴是 x-right、y-down、z-forward。 汽车的轴是 x-forward、y-left、z-up。 在此 function 中,仅使用mCameraToCarMatrix
的旋转部分。mIntrinsicMatrix
: 保存相机内在参数的 3x3 矩阵cameraPosition()[2]
: 汽车坐标系中相机的 Z 坐标(高度)。 它与mCameraToCarMatrix(2,3)
相同。function参数:
pixelPerMeter
:鸟瞰图的分辨率。 XY 平面上 1 米的距离将转换为鸟瞰图像中的pixelPerMeter
像素。origin
:鸟瞰图中相机的position 您可以将变换矩阵作为newCameraMatrix
传递给cv::initUndistortRectifyMaps()
,然后使用cv::remap
创建鸟瞰图。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.