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

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

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

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

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

код C ++:

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

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

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

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

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

Спасибо

3

Решение

есть несколько недостатков в использовании порог функция

  • он просто возвращает пороговое значение (не то, что вы ожидали)
  • «Мы не заботимся о выходном изображении» — ну, вам лучше!
  • если вы хотите установить пороговое значение для значения 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];
[sidenote: если вы действительно хотите обнаружить человеческие толпы, вам придется положить гораздо больше пота в это. просто различные рамки подвержены ошибкам при изменении освещения, также есть птицы, машины и светофоры]
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]