Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
立体校准&x2B;OpenCV中的校正_Opencv_Computer Vision_Stereo 3d - Fatal编程技术网

立体校准&x2B;OpenCV中的校正

立体校准&x2B;OpenCV中的校正,opencv,computer-vision,stereo-3d,Opencv,Computer Vision,Stereo 3d,我正在做一个立体视觉设置,在机翼上方安装两个摄像头。左侧摄像头向内倾斜几度,而右侧摄像头与机翼平行。所有可用图像 然后使用(剪切和粘贴,但不按原样编译) 在正确的图像中,黑色区域不应该在右边吗?因为正确的相机应该向右倾斜 此外,ROI(用红框表示)显然是错误的,尽管立体校正似乎有效 我的校准好吗?顺便说一句,cv::stereocalibrate返回的重投影错误为0.6004请查看底部的绿色匹配线-没有对应关系。在实践中,你必须在不同的位置和方向使用大约20-30个棋盘模式姿势(校准装置),包括

我正在做一个立体视觉设置,在机翼上方安装两个摄像头。左侧摄像头向内倾斜几度,而右侧摄像头与机翼平行。所有可用图像

然后使用(剪切和粘贴,但不按原样编译)

在正确的图像中,黑色区域不应该在右边吗?因为正确的相机应该向右倾斜

此外,ROI(用红框表示)显然是错误的,尽管立体校正似乎有效


我的校准好吗?顺便说一句,cv::stereocalibrate返回的重投影错误为0.6004

请查看底部的绿色匹配线-没有对应关系。在实践中,你必须在不同的位置和方向使用大约20-30个棋盘模式姿势(校准装置),包括深度旋转(倾斜、倾斜)、平面内旋转,请至少在一些校准快照中覆盖整个图像,或在不同快照中一致地逐部分覆盖

需要多个校准图像的原因如下。考虑齐次坐标系中无穷远处的点(称为理想点或消失点)。沿x方向的理想点为
Xinf=[1,0,0,0]T
如果你把它带回欧几里德空间,你会得到[1/0=Inf,0/0,0/0]T。如果你把你的投影矩阵从左边乘以Xinf(同调坐标),结果除了第一列外,到处都是零结论:X方向上的消失点给出投影矩阵的第一列。其他列来自其他消失点。更难证明相反的情况——也就是说,要得到正确的P,你需要消失点,让我们现在假设它


校准的问题在于,你的装备中没有清晰的消失点,因为它正面对着相机。您必须使其倾斜以使投影线会聚(在多个方向上形成消失点)。另一个问题是,你的装备只占据了图像的一小部分,而这正是优化发生在其他领域的代价。使用多个装备姿势重新校准,您将获得更好的效果

有关执行相机校准的提示,请参阅此其他答案:我以前已经阅读过该链接,但谢谢!此外,它没有解决ROI问题。也许这个问题本质上是数值问题?@user3417036您能为我提供FLI3相机的中心参数吗。谢谢。@VenushkaT这不会有用,因为内在参数取决于使用的镜头(畸变系数)。我建议您自己进行校准。如果你不想编码,这也可以。嗨,谢谢你的回复。实际上,我使用了大约15帧进行校准(虽然它不在box文件夹中),然后我使用上传的图像(在box中)进行验证。我理解需要多个校准帧来估计立体校准参数。我认为校准是正确的,因为如果你看棋盘本身,图像看起来是正面平行的。棋盘转角至少垂直排列。我将尝试按照您的建议使用更多的校准帧,看看是否有帮助。您将需要更多的图像,因为在链接的最后一张图像上,缝合的_cs.png绿色线条连接图像中假定相同的行,但在底部失败。这意味着您的校准仅适用于上半部分,除非您现在执行了更好的校准。对于当前的应用,上半部分很好,因为机翼向上弯曲。但是,我仍然存在明显无效的ROI的问题。底部的无效校正可能意味着图像校正失败,因为即使顶部看起来正常,姿势估计错误。如果我错了,请纠正我,在cv::stereocalibration中,我们基本上是计算旋转(R)和平移(t)在两个摄像机坐标系之间。这意味着R,t必须对整个帧有效。是否有好处,这是另一个问题。因此,在cv::StereoRective中,如果图像的“顶部”对齐,则整个重新映射应该是良好的(不一定精确)。我错了吗?
// performing stereocalibration given imagePoint_leftcamera and rightcamera
Flea3.reproj_error = stereoCalibrate(objectPoints,imagePoints_left,imagePoints_right,cameraMatrix_left,
        distCoeffs_left,cameraMatrix_right,distCoeffs_right,imageSize, Flea3.R, Flea3.T, Flea3.E, Flea3.F,
        TermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 100, 1e-5),
        CV_CALIB_FIX_INTRINSIC );

// Peform stereorectification
stereoRectify(cameraMatrix_left, distCoeffs_left, cameraMatrix_right, distCoeffs_right, imageSize, Flea3.R, Flea3.T, Flea3.R1, Flea3.R2, Flea3.P1, Flea3.P2, Flea3.Q, CALIB_ZERO_DISPARITY, -1, Size(), &Flea3.validRoi_left, &Flea3.validRoi_right);

//computes undistort and rectify maps
initUndistortRectifyMap(cameraMatrix_left, distCoeffs_left, R1, P1, imageSize, CV_16SC2, rmap[0][0], rmap[0][2]);
initUndistortRectifyMap(cameraMatrix_right, distCoeffs_right, R2, P2, imageSize, CV_16SC2, rmap[1][0], rmap[1][3]);

remap(src_left, img_left, rmap[0][0], rmap[0][4], CV_INTER_LINEAR);
remap(src_right, img_right, rmap[1][0], rmap[1][5], CV_INTER_LINEAR);