OpenCV, как получить bool true, если изображения `==` и false, если нет? - PullRequest
0 голосов
/ 10 июля 2011

Итак, мы попробуем код вроде:

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

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

но, похоже, не работает. Так как получить bool, если содержимое данных кадров, полученных с камеры, одинаковое или нет?

Ответы [ 3 ]

2 голосов
/ 17 июля 2012

Ваш метод терпит неудачу, потому что в реальном видеопотоке с камеры (из вашего кода я вижу, что вы снимаете с камеры) каждые два кадра не равны из-за шума, изменения освещенности, небольшого движения камеры и т. Д. 1001 *

cv::norm(m1,m2) < epsilon

Где epsilon - это число без знака, которое вы можете найти самостоятельно (это зависит от ваших критериев). Это очень быстрое и простое решение.

Посмотрите на ссылку karlphillip , чтобы получить более эффективное решение.

0 голосов
/ 17 июля 2012

В 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...