我从视频中捕捉到了不同帧的汽车位置。 假设视频帧 1 处的汽车(例如图像中向我们驶来的左侧汽车)的质心是视频帧 4 处的 P(x1,y1) 和 Q(x2,y2)。
是否可以将 P 和 Q 点表示为 3D?这样我就可以计算正确的像素距离 d(PQ) 并最终计算实际距离
注意:您可以假设相机是静止的,放置在距离地面 10 m 的高度。如果您愿意,您 也可以假设任何合适的数据,您也可以参考下图。
我从视频中捕捉到了不同帧的汽车位置。 假设视频帧 1 处的汽车(例如图像中向我们驶来的左侧汽车)的质心是视频帧 4 处的 P(x1,y1) 和 Q(x2,y2)。
是否可以将 P 和 Q 点表示为 3D?这样我就可以计算正确的像素距离 d(PQ) 并最终计算实际距离
注意:您可以假设相机是静止的,放置在距离地面 10 m 的高度。如果您愿意,您 也可以假设任何合适的数据,您也可以参考下图。
[编辑] 这是它的完成方式。
步骤: 1. 隔离分路器部分。
然后,使用 Houghlines,找出 Image 中最长的线。找出跨越图像边界的极值点。你得到了四边形点。我通过手动选择它们跳过了这一部分。在我的例子中,图像顶部的道路宽度是 10,底部是 60。
现在,对于Destination,我们必须对Destination 进行Image,以便Divider Quadilateral 具有60 的统一宽度,因此我们将新点保存在另一个数组中,它们具有相同的底点,但顶点被修改,因为它们形成了一个与图像高度相同的矩形(或更大,您可以在运行一次并查看结果后进行调整),但宽度为 60。请记住,我们正在转换我们的图像,以便分隔线适合这个矩形区域。图像会自动改变。
现在,使用
Mat TransformMat = getPerspectiveTransform(ipPts, opPts);
在初始和目标四边形点上的opencv,我们得到一个变换矩阵,我们将其应用于我们的测试图像。
warpPerspective(ipImg, opImg, TransformMat, ipImg.size());
你会看到很多区域被裁剪以适应 InputImage 大小的输出。但是,您会注意到 Image 被转换为并行 Divider,正如我们预期的那样。通过执行一些翻译和东西,并采取更大尺寸的输出图像,你会得到这个。我们永远无法获得完美包装的输出图像,因为它的大小可能非常大。但是我们会遇到一些约束来完成我们的任务。这是最后一张图片:
这看起来像是一种光线追踪问题。如果您知道相机的位置和方向,您应该能够计算3x4 投影矩阵及其逆矩阵。
这应该允许您从图像点转换为 3d 位置(在路上)。这个讨论http://opencv-users.1802565.n2.nabble.com/2D-to-3D-projection-with-given-plane-td7272428.html可能有更多有用的信息。
至于在matlab中应用它。有一个affine3d可用于存储变换。文件交换中的投影/光线追踪也可能有用,例如http://www.mathworks.com/matlabcentral/fileexchange/25974-raytracer但我没有详细查看与什么相关的内容你要。
如果您可以校准您的相机,并且如果您可以检测到路面上的一些参考点,那么您可以获得道路上图像点的 3D 坐标。这假设道路在平面上。换句话说,如果你能检测到一辆汽车,那么你就可以计算出汽车底部的 3D 坐标。使用计算机视觉系统工具箱在 MATLAB 中查看此示例。