【问题标题】:How to use mask in drawMatches function c++如何在drawMatches函数c ++中使用掩码
【发布时间】:2015-05-27 15:36:12
【问题描述】:

我正在用 opencv 和立体相机做一个程序。我想知道下面第一台摄像机中检测到的点和第二台摄像机中检测到的点。我的想法是我有一些检测器、提取器和匹配方法,并且按照 opencv 中的示例,我有一个算法来过滤匹配并只绘制好的匹配,但在我的情况下,min_dist 参数取决于我的 trackBar 位置。

这是opencv例子的代码:http://docs.opencv.org/doc/tutorials/features2d/feature_flann_matcher/feature_flann_matcher.html#feature-flann-matcher

我做了一些改变来移动比赛之间的最小距离。

//TrackBar position
dist_track = getTrackbarPos(nombreTrackbar, BUTTON_WINDOW);
        cout <<"Posicion de la barra: " << dist_track << endl;
        good_matches.clear();

        //Obtain good_matches
        for( int i = 0; i < descriptors[0].rows; i++ )
        { if( matches[i].distance <= coef*dist_track)  
        { good_matches.push_back( matches[i]);}
        }

主要的想法是,当我将 trackBar 放在开头时,我有正确的匹配项,但是当 trackbar 放在最后时,我发现的匹配项不正确。在这种情况下,我找到了很多匹配项,但其中很多都是错误的。

现在我正在尝试正确处理图像。我想在 drawmatches 函数中使用掩码来强制检测到的第二个摄像头点必须靠近核线。有人可以问我一些事情吗? 有人知道如何使用 mask 参数来强制创建的匹配器需要在极线中吗?

或者如何创建掩码参数?

谢谢朋友!

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    最后我决定改变我的经营方式。我正在尝试剪切原始图像并仅保留必要的信息。我的意思是我取出照片的信息,它不介意我的应用程序,只保留我将要使用的信息。

    我的想法是使用两个相机的核线来确定我拥有的感兴趣区域,我将计算两个图像中核线的位置,然后剪切图像并仅保留核线所在的信息.

    这样做我获得了两个新图像,我的想法是将新闻图像传递给匹配器方法,看看我是否可以获得更成功的匹配。 截断前的图片:

    图片后来被剪掉了:

    但是我对计算时间有疑问。我的代码需要很高的计算成本,有时程序会失败。错误显示“分段错误:11”。 如果我退出 waitKey() 行,则会出现“总线错误 10”。 我在第二个中复制主要图像内容的代码在那里:

    >     for (int i=0; i<RightEpipolarLines.rows; i++) {
    >         float m = -RightEpipolarLines(i, 0)/RightEpipolarLines(i, 1);
    >         float n = -RightEpipolarLines(i, 2)/RightEpipolarLines(i, 1);
    >         for (int x = 0; x < 480; x++) {
    >             float y_prima = m*x + n;
    >             int y = int (y_prima);
    >             (cut_image[0].at<float>(y, x)) = capture[0].at<float>(y, x);
    >         }
    >         
    >     }
    >     waitKey();
    >     for (int i = 0; i<LeftEpipolarLines.rows; i++) {
    >         float m = LeftEpipolarLines(i, 0)/LeftEpipolarLines(i, 1);
    >         float n = -LeftEpipolarLines(i, 2)/LeftEpipolarLines(i, 1);
    >         for (int x = 0; x < 480; x++) {
    >             float y_prima = m*x + n;
    >             int y = int (y_prima);
    >             (cut_image[1].at<float>(y, x)) = capture[1].at<float>(y, x);
    >         }
    >     }
    >     waitKey();
    

    有人知道如何更有效地在真实捕获和 cut_image 之间传递信息吗?我只想传递核线附近的像素信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-21
      • 2023-03-07
      • 1970-01-01
      • 2019-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多