如果图像是“==”,OpenCV如何获得bool true,否则返回false?

时间:2011-07-09 22:46:08

标签: c++ image opencv camera

所以我们尝试代码:

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

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

但似乎没有用。那么如果从相机捕获的帧数据内容是否相同,如何获得bool?

3 个答案:

答案 0 :(得分:2)

你的方法失败了,因为在真实的相机视频流中(从你的代码中我看到你从相机中捕获)每两帧都不相同,因为噪音,变化的照明,小的相机运动等。你可以改变你的检查: / p>

cv::norm(m1,m2) < epsilon

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

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

答案 1 :(得分:0)

答案 2 :(得分:0)

在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'。