gpt4 book ai didi

c++ - OpenCV triangulatePoints 变化的距离

转载 作者:可可西里 更新时间:2023-11-01 18:38:25 27 4
gpt4 key购买 nike

我正在使用 OpenCV 的 triangulatePoints 函数来确定立体相机成像的点的 3D 坐标。

我正在体验这个功能让我到同一点的距离不同,具体取决于相机到该点的角度。

这是一个视频: https://www.youtube.com/watch?v=FrYBhLJGiE4

在本视频中,我们跟踪“X”标记。在左上角显示有关正在跟踪的点的信息。 (Youtube 降低了质量,视频通常更清晰。(2x1280)x 720)

在视频中,左摄像头是 3D 坐标系的原点,它在正 Z 方向看。左摄像头正在经历一些 转换,但远没有triangulatePoints 函数让人相信的那么多。 (更多信息在视频说明中。)

公制单位是 mm,因此该点最初在距离左侧相机约 1.94 米处进行三角测量。

我知道校准不够精确会导致此行为。我使用棋盘模式运行了三个独立的校准。结果参数对我的口味来说变化太大。 (焦距估计约为 +-10%)。

如您所见,视频没有高度失真。直线在任何地方看起来都很直。所以最佳相机参数必须接近我已经使用的参数。

我的问题是,还有什么其他原因会导致这种情况吗?

两个立体相机之间的会聚角可以产生这种效果吗?还是基线长度错误?

当然,特征检测总是存在错误的问题。因为我使用光流来跟踪“X”标记,所以我得到了亚像素精度,这可能会被误认为...我不知道...+-0.2 像素?

我正在使用 Stereolabs ZED 立体相机。我直接使用 OpenCV 访问视频帧。相反,我必须使用购买相机时获得的特殊 SDK。我突然想到,我正在使用的这个 SDK 可能会自己做一些不失真的事情。

所以,现在我想知道...如果 SDK 使用不正确的畸变系数对图像进行去畸变,是否可以创建既不是桶形畸变也不是枕形畸变但完全不同的图像?

最佳答案

ZED Camera 附带的 SDK 可对图像进行去畸变和校正。几何模型基于与openCV相同的:

  • 左右摄像头的内在参数和畸变参数。
  • 左右旋转/平移的外部参数。

通过 ZED 的其中一个工具(ZED Settings App),您可以为左/右和失真系数以及基线/收敛输入您自己的内在矩阵。

要获得精确的 3D 三角测量,您可能需要调整这些参数,因为它们对您在转换为深度之前估计的差异有很大影响。

OpenCV 提供了一个很好的模块来校准 3D 相机。它确实:- Left 和 Right 的单声道校准 (calibrateCamera),然后是立体声校准 (cv::StereoCalibrate())。它将输出内部参数(焦距、光学中心(非常重要))和外部参数(如果 R 是 3x1 矩阵,基线 = T[0]、收敛 = R[1])。 RMS(stereoCalibrate() 的返回值)是查看校准是否正确完成的好方法。

重要的是您需要对原始图像进行校准,而不是使用 ZED SDK 提供的图像。由于 ZED 是标准的 UVC 相机,您可以使用 opencv 获取并排原始图像(具有正确设备编号的 cv::videoCapture)并提取左和右原生图像。

然后您可以在工具中输入这些校准参数。然后 ZED SDK 将执行去失真/校正并提供校正后的图像。 getParameters() 中提供了新的相机矩阵。在进行三角测量时,您需要获取这些值,因为图像会被校正,就好像它们是从这个“理想”相机中拍摄的一样。

希望对您有所帮助。/OB/

关于c++ - OpenCV triangulatePoints 变化的距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33154523/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com