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
C++ 在摄影机之间查找外部对象_C++_Opencv_Computer Vision_Bundler_Levenberg Marquardt - Fatal编程技术网

C++ 在摄影机之间查找外部对象

C++ 在摄影机之间查找外部对象,c++,opencv,computer-vision,bundler,levenberg-marquardt,C++,Opencv,Computer Vision,Bundler,Levenberg Marquardt,我所处的情况是,我需要根据图像对应找到两个或多个摄影机之间的相对摄影机姿势(因此摄影机不在同一点)。为了解决这个问题,我尝试了与描述相同的方法(代码如下) cv::Mat校准_1=。。。; cv::Mat校准_2=。。。; cv::Mat校准\目标=校准\ 1; (0,2)处的校准目标=0.5f*帧宽度;//主要观点 (1,2)处的校准目标=0.5f*帧高度;//主要观点 自动基本矩阵=cv::findFundamentalMat(左匹配、右匹配、cv\u RANSAC); 基本矩阵。conve

我所处的情况是,我需要根据图像对应找到两个或多个摄影机之间的相对摄影机姿势(因此摄影机不在同一点)。为了解决这个问题,我尝试了与描述相同的方法(代码如下)

cv::Mat校准_1=。。。;
cv::Mat校准_2=。。。;
cv::Mat校准\目标=校准\ 1;
(0,2)处的校准目标=0.5f*帧宽度;//主要观点
(1,2)处的校准目标=0.5f*帧高度;//主要观点
自动基本矩阵=cv::findFundamentalMat(左匹配、右匹配、cv\u RANSAC);
基本矩阵。convertTo(基本矩阵,CV_32F);
cv::Mat essential_matrix=校准_2.t()*基本矩阵*校准_1;
cv::SVD SVD(基本矩阵);
cv::Matx33f w(0,-1,0,
1,0,0,
0,0,1);
cv::Matx33f w_inv(0,1,0,
-1,0,0,
0,0,1);
cv::Mat在摄像机之间的旋转=svd.u*cv::Mat(w)*svd.vt//赫兹9.19
但在大多数情况下,我都会得到非常奇怪的结果。所以我的下一个想法是使用一个成熟的捆绑调整器(它应该满足我的需求?!)。目前我唯一的大依赖是OpenCV,他们只有一个未记录的捆绑调整实现

因此,问题是:

  • 是否有一个无依赖性且使用允许商业使用的许可证的捆绑调整器
  • 有没有其他简单的方法可以找到外在因素
  • 与摄像机的距离相差甚远的物体是否存在问题?(大视差)

提前感谢

我也在处理同样的问题,面临更棘手的问题。 以下是一些建议:

  • 分解前修改基本矩阵: 在分解前修改基本矩阵[U W Vt]=SVD(E),新的E'=diag(s,s,0),其中s=W(0,0)+W(1,1)/2

  • 两阶段基本矩阵估计: 使用RANSAC内插器重新计算基本矩阵


  • 这些步骤将使旋转估计更容易受到噪声的影响。

    您必须获得4种不同的解决方案,并选择具有最多正Z坐标点的解决方案。通过反转基本矩阵的符号,用w_inv替换w,生成解决方案。虽然计算了w_inv,但您没有这样做。您是否重复使用其他代码?

    能否提供更多详细信息?两个摄像机都有一个共同的视野(FOV)?摄像机是相同的型号-但不完全相同-因此本质可能略有不同。理想情况下,内部也会进行调整,但这不是我目前的首要问题,我的主要问题是两个摄像头是否有一个可以成像的公共区域。如果是,您可以在该公共区域放置一个棋盘,并找到摄像头之间的相对姿势。摄像头的重叠部分约为水平视野的30%,但我不能使用棋盘或任何其他图案-我的输入是功能对应。谢谢您的回答,您能更详细地解释第一步吗?
    cv::Mat calibration_1 = ...;
    cv::Mat calibration_2 = ...;
    cv::Mat calibration_target = calibration_1;
    calibration_target.at<float>(0, 2) = 0.5f * frame_width;  // principal point
    calibration_target.at<float>(1, 2) = 0.5f * frame_height; // principal point
    
    auto fundamental_matrix = cv::findFundamentalMat(left_matches, right_matches, CV_RANSAC);
    fundamental_matrix.convertTo(fundamental_matrix, CV_32F);
    cv::Mat essential_matrix = calibration_2.t() * fundamental_matrix * calibration_1;
    cv::SVD svd(essential_matrix);
    cv::Matx33f w(0,-1,0,
        1,0,0,
        0,0,1);
    cv::Matx33f w_inv(0,1,0,
        -1,0,0,
        0,0,1);
    cv::Mat rotation_between_cameras = svd.u * cv::Mat(w) * svd.vt; //HZ 9.19