我正在使用OpenCV的triangulatePoints
函数来确定由立体摄像机成像的点的3D坐标。
我遇到此功能给我到同一点的不同距离,具体取决于相机到该点的角度。
这是一个视频:
https://www.youtube.com/watch?v=FrYBhLJGiE4
在此视频中,我们正在跟踪“X”标记。在左上角显示有关正在跟踪的点的信息。 (Youtube降低了质量,视频通常会更加清晰。(2x1280)x 720)
在视频中,左摄像机是3D坐标系的原点,并且沿Z轴正方向看。左镜头正在经历一些翻译,但不及triangulatePoints
函数所导致的相信。 (更多信息在视频说明中。)
公制单位是mm,因此该点最初是在距左侧摄像机约1.94m的距离处进行三角剖分的。
我知道校准不够精确会导致这种现象。我已经使用棋盘图案进行了三个独立的校准。所产生的参数对于我的口味而言变化太大。 (对于焦距估计,大约为+ -10%)。
如您所见,该视频的而不是高度失真。直线到处都看起来很笔直。因此,最佳相机参数必须与我已经在使用的参数接近。
我的问题是,还有其他因素会导致这种情况吗?
两个立体摄像机之间的会聚角可以产生这种效果吗?还是基线长度错误?
当然,在特征检测中总是存在错误的问题。由于我使用光流来跟踪'X'标记,因此我得到的亚像素精度可能会被误认为...我不知道... + -0.2 px?
我正在使用Stereolabs ZED立体摄像机。我是,而不是,直接使用OpenCV访问视频帧。相反,我必须使用购买相机时获得的特殊SDK。在我看来,我正在使用的此SDK可能是,它本身做了一些变形。
所以,现在,我想知道...如果SDK使用不正确的失真系数来使图像失真,那么是否可以创建出既不桶形也不失真,枕形失真但完全不同的图像呢?
最佳答案
ZED相机随附的SDK执行图像的不失真和校正。几何模型基于与openCV相同的模型:
左和右摄像机的
通过ZED的一种工具(“ZED设置”应用程序),您可以输入自己的固有矩阵,以实现“左/右”和“失真系数”以及“基线/收敛”。
为了获得精确的3D三角剖分,您可能需要调整这些参数,因为它们对转换为深度之前估计的视差有很大影响。
OpenCV提供了一个很好的模块来校准3D摄像机。它确实:
-左右校准单声道(calibrateCamera),然后进行立体声校准(cv::StereoCalibrate())。它将输出内部参数(焦点,光学中心(非常重要))和外部参数(如果R是3x1矩阵,则基线= T [0],会聚= R [1])。 RMS(stereoCalibrate()的返回值)是查看校准是否正确完成的好方法。
重要的是您需要对原始图像进行此校准,而不是使用ZED SDK随附的图像。由于ZED是标准的UVC摄像机,因此您可以使用opencv并排获取原始图像(具有正确设备编号的cv::videoCapture)并提取Left和RIght native 图像。
然后,您可以在工具中输入这些校准参数。 ZED SDK随后将执行不失真/校正并提供校正后的图像。在getParameters()中提供了新的相机矩阵。进行三角剖分时,您需要获取这些值,因为图像的校正就好像是从此“理想”相机拍摄的一样。
希望这可以帮助。
/OB/
关于c++ - OpenCV triangulatePoints可变距离,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33154523/