使用 OpenCV 计算鸟瞰图
Calculating Bird's Eye View with OpenCV
在寻找一种计算鸟瞰图的简单方法时,我发现了来自 Matlab 的 this 方法。对于手动注释源点和目标点的问题,这似乎是一种非常实用的方法。一般来说,我想了解是否有一种数学方法可以仅根据物理相机属性计算源点和目标点。任何采用与 Matlab 示例相同的输入但基于 OpenCV 的代码都将不胜感激。
我知道 Whosebug 不是一个“去写我的代码”的社区,所以即使是有用的线索或任何数学运算也会受到赞赏。
它在您的 link 中表示输入图像必须未失真。因此,假设我们有一个图像,我们知道在现实世界坐标中垂直于图像平面的直线的欧拉角。
偏航角对我们的案例并不重要。如果您按滚动量(围绕中心像素)旋转图像,那么您应该能够使用间距量找到 4 个所需的点。要找到这些所需的点,我们需要知道相机的 horizontal 和 vertical FOV 值。
这 4 点是什么?在现实世界中从上方看时,它们形成一个矩形。矩形的宽度是一种设计选择。例如,近点可能向下倾斜 45 度(horizon 线之间),总宽度为 60 度,而远点可能向下倾斜 10 度,并具有一定的宽度角度。我们需要计算一次该角度。
令h
为相机的高度,x
为相机投影点到矩形平面内与矩形远边的距离(平行于horizon 行),并且 y
是矩形宽度距离的一半。鉴于上面的示例角度,x=h*cot(10)
和 y=h*csc(45)*tan(60/2)
。宽角变为2*atan2(y, x^2+h^2) = 2*atan2(csc(45)*tan(60/2), cot(10)^2+1)
.
例如,如果相机的视野为 70 度,则边缘的点与中心的距离为 35 度。但是中心和一个边缘之间的像素与中心 而不是 35/2 度。应该是 atan(tan(35)/2)
.
一旦找到想要的4个点,就可以使用findHomography
and warpPerspective
函数,其中dst_pts
的width/height比例最好是2*y/(x-h*cot(45)) = 2*csc(45)*tan(30)/(cot(10)-cot(45))
.
输入:未失真的图像、滚动和倾斜角度、相机的 FOV、所需的 ROI 角度
在寻找一种计算鸟瞰图的简单方法时,我发现了来自 Matlab 的 this 方法。对于手动注释源点和目标点的问题,这似乎是一种非常实用的方法。一般来说,我想了解是否有一种数学方法可以仅根据物理相机属性计算源点和目标点。任何采用与 Matlab 示例相同的输入但基于 OpenCV 的代码都将不胜感激。
我知道 Whosebug 不是一个“去写我的代码”的社区,所以即使是有用的线索或任何数学运算也会受到赞赏。
它在您的 link 中表示输入图像必须未失真。因此,假设我们有一个图像,我们知道在现实世界坐标中垂直于图像平面的直线的欧拉角。
偏航角对我们的案例并不重要。如果您按滚动量(围绕中心像素)旋转图像,那么您应该能够使用间距量找到 4 个所需的点。要找到这些所需的点,我们需要知道相机的 horizontal 和 vertical FOV 值。
这 4 点是什么?在现实世界中从上方看时,它们形成一个矩形。矩形的宽度是一种设计选择。例如,近点可能向下倾斜 45 度(horizon 线之间),总宽度为 60 度,而远点可能向下倾斜 10 度,并具有一定的宽度角度。我们需要计算一次该角度。
令h
为相机的高度,x
为相机投影点到矩形平面内与矩形远边的距离(平行于horizon 行),并且 y
是矩形宽度距离的一半。鉴于上面的示例角度,x=h*cot(10)
和 y=h*csc(45)*tan(60/2)
。宽角变为2*atan2(y, x^2+h^2) = 2*atan2(csc(45)*tan(60/2), cot(10)^2+1)
.
例如,如果相机的视野为 70 度,则边缘的点与中心的距离为 35 度。但是中心和一个边缘之间的像素与中心 而不是 35/2 度。应该是 atan(tan(35)/2)
.
一旦找到想要的4个点,就可以使用findHomography
and warpPerspective
函数,其中dst_pts
的width/height比例最好是2*y/(x-h*cot(45)) = 2*csc(45)*tan(30)/(cot(10)-cot(45))
.
输入:未失真的图像、滚动和倾斜角度、相机的 FOV、所需的 ROI 角度