目标是从KITTI图像(dataset)获得鸟眼视图,我有投影矩阵(3x4)。
生成转换矩阵的方法有很多。在鸟眼世界里,我读过一些数学表达式,比如:
H12 = H2*H1-1=A_R_A-1=P*A-1在OpenCV -投影、同形矩阵与鸟瞰中
和x= Pi * Tr *X在kitti数据集摄像机投影矩阵中
但这些选择都不符合我的目的。
PYTHON代码
将numpy作为np导入cv2
image = cv2.imread('Data/RGB/000007.png')
maxHeight,maxWidth = image.shape:2
M有3x4维
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)
这里需要一个具有3x3维的M矩阵
warped =cv2.Warp透视图(图像,M,(maxWidth,maxHeight))
显示原始和扭曲的图像
Cv2.imShow(“原始”,图像)
Cv2.imShow(“翘曲”,翘曲)
Cv2.等待键(0)
我需要知道如何管理投影矩阵,以获得鸟瞰。
到目前为止,我尝试过的每一件事都会向我抛出扭曲的图像,甚至没有接近我所需要的信息。
在左边,图像显示在3D (上图)和2D (以下)中检测汽车。右边是我想要的鸟瞰图。因此,我需要获得转换矩阵来转换分隔车辆的方框的坐标。
发布于 2019-11-02 17:39:39
下面是我手工构建鸟瞰转换的代码:
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-右,y-向下,z向前。车的轴是x向前,y-左,z-向上。在这个函数中,只使用mCameraToCarMatrix
的旋转部分。mIntrinsicMatrix
:保存摄像机内在参数的3x3矩阵cameraPosition()[2]
:汽车坐标系中相机的Z坐标(高度).它和mCameraToCarMatrix(2,3)
一样。功能参数:
pixelPerMeter
:鸟瞰图像的分辨率。XY平面上1米的距离将转化为鸟瞰图像中的pixelPerMeter
像素。origin
:摄像机在鸟瞰图像中的位置您可以将转换矩阵传递给cv::initUndistortRectifyMaps()
作为newCameraMatrix
,然后使用cv::remap
创建鸟瞰图像。
https://stackoverflow.com/questions/58668588
复制相似问题