【问题标题】:OpenCV how to get bool true if images are `==`and false if not?如果图像是`==`,OpenCV如何获得布尔真,否则如何获得假?
【发布时间】:2011-10-02 01:14:51
【问题描述】:

所以我们尝试如下代码:

cv::Mat m1, m2;
cv::VideoCapture cap(0);

do {
    cap >> m1;
    cap >> m2;
}   while(cv::norm(m1,m2)==0);
frames+=2;
     //...

但它似乎不起作用。那么如果从相机捕获的帧数据内容是否相同,如何获取布尔值?

【问题讨论】:

  • 你可以做一个difference 并检查它是否为零。
  • cv::norm() 是一种简单/快速的方法,但它没有考虑光照变化、视点变化,因此对这些属性中的任何一个进行最轻微的更改都会使该方法失败。

标签: c++ image opencv camera


【解决方案1】:

您的方法失败,因为在真实的相机视频流中(从您的代码中,我看到您从相机捕获)每两帧不相等,因为噪声、光照变化、相机运动小等原因。您可以将检查更改为:

cv::norm(m1,m2) < epsilon

epsilon 是一个你可以自己找到的无符号数字(这取决于你的标准)。这是非常快速和简单的解决方案。

查看 karlphillip 的链接以获得更有效的解决方案。

【讨论】:

  • 我赞成,因为我没有注意到他正在使用 cv::capture 来获取帧,这当然永远不会传递我的答案。
【解决方案2】:

【讨论】:

  • 我不想使用开放框架并坚持使用原生 OpenCV 2.2 C++ api。 opencv.absDiff () 也没有返回我要求的 bool。
【解决方案3】:

据我所知,OpenCV 中没有这样的功能,但它很容易实现。任何返回元素总和的函数都是错误的,因为一个像素的差异可以通过其他像素的差异来补偿。保证正确性的唯一方法是逐像素检查。这是一个简单的例子:

template<typename T>
bool identical(cv::Mat m1, cv::Mat m2)
{
    if(m1.cols != m2.cols || m1.rows != m2.rows)
      return false;

    for(int i=0; i<m1.rows; i++)
    {
       for(int j=0; j<m1.cols; j++)
       {
          if(m1.at<T>(i, j) != m2.at<T>(i, j))
            return false;
       }
    }

    return true;
}

我没有检查代码,所以,小心只是做一个'ctrl+c'。

【讨论】:

  • 不!!!!一点也不!。 cv::norm 将使用像素之间的距离来返回差异之和。因此,一个像素的差异可以通过其他像素的差异来补偿。例如,假设 norm 返回 0。除了像素 (50,50) 和 (51,51) 之外,所有像素都是相同的。 (50,50) 的差异是 -1,而 (51,51) 的差异是 1。这种情况下仍然返回 0 和范数,但不会在我的循环中通过。
  • Emm... 看看文档:opencv.willowgarage.com/documentation/cpp/… 差异不能小于零(使用任何 normType)...
  • 标准返回是所有像素的差异之和,女巫不考虑单个像素的差异。文档的哪一部分不符合我的评论资格?
  • 哦!我知道了。可以获得所有像素之间的最大差异。是的,如果他使用标志 NORM_INF,那么使用规范实际上会和我的循环一样。
猜你喜欢
  • 2013-06-04
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-14
  • 2017-07-30
相关资源
最近更新 更多