Обнаружение движения с использованием OpenCV/C++, порог всегда становится равным нулю

Я работаю над кодом обнаружения толпы C++ с «OpenCV», который берет 2 кадра и вычитает их. Затем сравните результат с порогом.

Я впервые имею дело с «OpenCV» для C++, и у меня мало информации об этом.

Это шаги кода:

  1. Возьмите два видеокадра с интервалом в α минут.
  2. Преобразование кадров в черно-белые изображения.
  3. Вычтите два кадра.
  4. Сравните разницу с порогом.
  5. Если разница ‹= пороговое значение, то толпа обнаружена иначе --> толпы нет.

код С++:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main (int argc, const char * argv[])
{
//first frame.
Mat current_frame = imread("image1.jpg",CV_LOAD_IMAGE_GRAYSCALE);

//secunde frame.
Mat previous_frame = imread("image2.jpg",CV_LOAD_IMAGE_GRAYSCALE);

//Minus the current frame from the previous_frame and store the result.
Mat result = current_frame-previous_frame;

//compare the difference with threshold, if the deference <70 -> there is crowd.
//if it is > 70 there is no crowd
int threshold= cv::threshold(result,result,0,70,CV_THRESH_BINARY);

if (threshold==0) {
    cout<< "crowd detected \n";
}
else {
    cout<<" no crowd detected \n ";
}   
}

Проблема в следующем: порог всегда равен нулю! и вывод всегда: обнаружена толпа, даже если толпы нет

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

Моя цель - узнать, насколько велика разница между двумя кадрами. Я хочу сравнить уважение с порогом, чтобы обнаружить человеческую толпу в определенном месте.

Я надеюсь, что один из вас может мне помочь

Спасибо


person Afnan    schedule 19.11.2013    source источник


Ответы (1)


есть несколько недостатков в использовании вами функции threshold

  • он просто возвращает пороговое значение (не то, что вы ожидали)
  • «Нас не волнует выходное изображение» — ну так вам лучше!
  • если вы хотите установить пороговое значение для значения 70, это должен быть ваш 3-й аргумент, а не 4-й (4-й аргумент — это значение, все >thresh установлено

то, что вы, вероятно, хотели, это:

cv::threshold(result,result,70,1, CV_THRESH_BINARY); // same as : result = result>70;
int on_pixels = countNonZero(result);
// or:
int on_pixels = sum(result)[0];

[примечание: если вы действительно хотите обнаруживать людские толпы, вам придется намного больше попотеть. просто дифференциация кадров склонна ошибаться с изменением освещения, также есть птицы, машины и светофоры]

person berak    schedule 19.11.2013
comment
Я пробую этот код, и порог становится равным 70. Моя цель - узнать, насколько велика разница между двумя кадрами. Я хочу сравнить уважение с порогом, чтобы обнаружить человеческую толпу в определенном месте. - person Afnan; 20.11.2013
comment
Ты не понял. возвращаемое значение не имеет значения . вы не можете использовать его ни для чего. - person berak; 20.11.2013
comment
Возвращаемое значение из порога или что? Я не понимаю вашего комментария. * Я не понимаю вашего примечания, не могли бы вы объяснить его мне, пожалуйста? - person Afnan; 21.11.2013
comment
также вы, вероятно, захотите сделать absdiff, а не только diff, когда вы берете разницу кадров - person nass; 08.04.2014
comment
насс, правда, главная проблема все-таки в том, что все это слишком наивно, чтобы быть полезным - person berak; 08.04.2014