OpenCV 如何在图像为 ==` 时获取 bool true,如果不是则获取 false?

发布于 2024-11-19 09:46:18 字数 231 浏览 2 评论 0原文

所以我们尝试这样的代码:

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

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

但它似乎不起作用。那么相机采集的帧数据内容是否相同如何获取bool呢?

So we try code like:

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

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

but it seems not to work. So how to get bool if frames data contents captured from camera are same or not?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

梅窗月明清似水 2024-11-26 09:46:18

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

cv::norm(m1,m2) < epsilon

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

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

Your method fails because in real camera videostream (from your code I see that you capture from camera) every two frames are not equal because of noise, changing illumination, small camera motion etc. You can change your check to this:

cv::norm(m1,m2) < epsilon

Where epsilon is some unsigned number which you can find by yourself (it depends on your criteria). This is very fast and simple solution.

Look at karlphillip's link to get more efficient solution.

星星的轨迹 2024-11-26 09:46:18

据我所知,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”。

There is no such a function I'm aware off in OpenCV, but it can easily be implemented. Any function that return's a sum of the elements will be wrong, because differences in one pixel can be compensated by differences in other pixels. The only way to guarantee correctness is by doing a pixel by pixel check. Here is a simple example:

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;
}

I didn't checked the code, so, be careful just doing a 'ctrl+c'.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文