【问题标题】:What do the values of the mask parameter returned by findHomography represent?findHomography 返回的 mask 参数的值代表什么?
【发布时间】:2013-03-26 18:27:38
【问题描述】:

我将 OpenCV 的函数 findHomography 与 RANSAC 方法一起使用,以找到将两个图像与一组关键点相关联的单应性。

主要问题是我无法在任何地方找到函数输出的掩码矩阵的值。

我知道的唯一信息是 0 值是异常值,非零值是异常值。但这意味着内部值是什么?有人知道吗?

我调用findHomography的一段代码:

cv::Mat H12;
cv::Mat mask;

H12 = cv::findHomography(FvPointsIm1, FvPointsIm2, mask, CV_RANSAC, 5); 
ui->Debug_Label->setText(Mat2QString(mask));

【问题讨论】:

  • 你问的是inlier/outlier区分的含义,还是掩码中的数值?
  • 关于掩码中的数值。
  • 您是否得到过除01 以外的值?
  • 离群值是 0。离群值得到值,其中大多数非常小。它们的数量级在 e^-200 和 e^-400 之间。
  • 你能把代码贴在你调用findHomography的地方,然后检查掩码值吗?很高兴知道您的掩码输入的类型。

标签: c++ opencv computer-vision homography ransac


【解决方案1】:

findHomography 返回的掩码是一个 8 位、单通道 cv::Mat(或 std::vector<uchar>,如果您愿意),包含 01,表示异常状态。

编辑:您通过调用.at<double> 访问掩码的每个元素,这会导致输出混乱。您应该使用.at<uchar>,它将正确解释矩阵值。

【讨论】:

  • 要将掩码的值转换为 QString,我对每个矩阵字段使用以下内容:` QString::number(mask.at(i,j)) `
  • 很好,这是个错误。非常感谢!
  • 我无法正确打印值:mask.at<uchar>(0, 0)。它会打印一个带有值“0 0, 0 1”的小矩阵图标...你知道为什么吗?
  • 好吧...只是我像他一样调用 findHomography(),当我按照你的建议打印 cout << mask.at<uchar>(0, 0) << endl; 时,我没有得到 0 或 1。我会如果您认为与此处不同,请参阅问另一个问题。
  • @user1368342 我已经重现了您的问题。将结果转换为 int 以查看数值,如下所示:cout << (int)mask.at<uchar>(0,0) << endl;
【解决方案2】:

我在应用关键点匹配后使用了 findHomography 方法。

  • 内点 是被计算为真阳性(正确匹配)的匹配关键点;
  • 异常值 是被计算为误报(错误匹配)的匹配关键点。

然后您可以使用掩码输出从所有匹配项中提取正确匹配项的子集。

  • 在 Python 3.6 & OpenCV 3.4.1 中有一个例子:

    good_kp = [gray_kp[m.queryIdx].pt for m in good_matches]
    correct_matched_kp = [good_kp[i] for i in range(len(good_kp)) if mask[i]]
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 2011-09-11
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多