c – OpenCV triangulatePoints变化的距离

前端之家收集整理的这篇文章主要介绍了c – OpenCV triangulatePoints变化的距离前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用OpenCV的triangulatePoints函数来确定立体相机成像点的3D坐标.

我正在经历这个功能根据相机到该点的角度给我不同的距离到同一点.

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

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

在视频中,左侧相机是3D坐标系的原点,它正向Z方向看.左相机正在进行一些翻译,但几乎没有triangulatePoints功能导致相信. (更多信息在视频说明中.)

公制单位为mm,因此该点最初在距离左相机约1.94m处进行三角测量.

我知道不够精确的校准会导致这种行为.我使用棋盘图案运行了三次独立校准.由此产生的参数因我的口味而变化太大. (焦距估计约为-10%).

如您所见,视频没有严重失真.直线在任何地方看起来都很直.因此,最佳摄像机参数必须接近我已经使用的参数.

我的问题是,还有什么可以导致这种情况吗?

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

当然,在特征检测中总是存在错误.由于我使用光流跟踪’X’标记,我得到亚像素精度,这可以被误解……我不知道…… -0.2 px?

我正在使用Stereolabs ZED立体相机.我不是直接使用OpenCV访问视频帧.相反,我必须使用购买相机时获得的特殊SDK.我发现这个我正在使用的SDK可能正在做一些不成比例的事情.

所以,现在我想知道……如果SDK使用不正确的失真系数来解决图像,那么这可以创建既不是桶形失真也不是枕形失真但完全不同的图像?

解决方法

随ZED相机提供的SDK执行图像的不失真和校正.几何模型基于与openCV相同的模型:

>左右摄像机的内部参数和失真参数.
>右和左之间旋转/平移的外在参数.

通过ZED(ZED设置应用程序)的工具之一,您可以为左/右和失真系数以及基线/收敛输入您自己的内在矩阵.

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

OpenCV提供了一个很好的模块来校准3D摄像机.它确实:
– 左和右的单声道校准(calibrateCamera),然后是立体声校准(cv :: StereoCalibrate()).它将输出固有参数(focale,光学中心(非常重要))和外在(基线= T [0],如果R是3×1矩阵,则收敛= R [1]). RMS(stereoCalibrate()的返回值)是查看校准是否正确完成的好方法.

重要的是,您需要在原始图像上进行此校准,而不是使用ZED SDK提供的图像.由于ZED是标准的UVC相机,您可以使用opencv来获取并排的原始图像(带有正确设备编号的cv :: videoCapture)并提取Left和RIght原生图像.

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

希望这可以帮助./ OB /

原文链接:https://www.f2er.com/c/117794.html

猜你在找的C&C++相关文章