отладка метода поиска среднего значения кадров из видео для обнаружения движения с использованием OpenCV в C++

Итак, чтобы попрактиковаться в C++, я пишу программу обнаружения движения, которая загружает фотографии в dropbox с помощью библиотеки OpenCV, проект, который я сделал прошлым летом в pyton, следуя этому руководству: https://www.pyimagesearch.com/2015/05/25/basic-motion-detection-and-tracking-with-python-and-opencv/

Этот участок кода запускается один раз, а затем выдает ошибку во втором цикле.

Это код:

Mat set_delta(Mat &average, Mat gray_frame)
{
    Mat delta_frame;
    if (average.empty()==1)
    {
        cout<<"gray frame depth: "<<gray_frame.depth();

        gray_frame.convertTo(average, CV_32FC(gray_frame.channels()));
        //Mat Acc(gray_frame.rows,    gray_frame.cols,CV_32FC(gray_frame.channels()));
    }
    //cout<<"gray_frame average: "<< get_average(gray_frame)<<
    //      "\naverage_frame average: "<<get_average(average);
    Mat Acc(average.rows, average.cols,CV_32FC(average.channels()));

    cout<<"average depth: "<<average.depth()<<"\nAcc depth: "<<Acc.depth();

    accumulateWeighted(gray_frame, average, .5);
    convertScaleAbs(average, average);
    absdiff(gray_frame,average,delta_frame);
    return delta_frame;
}

Я получаю эту ошибку:

OpenCV Error: Assertion failed (func != 0) in accumulateWeighted, file /build/opencv/src/opencv-3.3.1/modules/imgproc/src/accum.cpp, line 635
terminate called after throwing an instance of 'cv::Exception'
what():  /build/opencv/src/opencv-3.3.1/modules/imgproc/src/accum.cpp:635: error: (-215) func != 0 in function accumulateWeighted

ошибка генерируется функцией аккумуляции Weighted, которую я пытался исправить, создав локальный массив Acc после прочтения этих страниц:

http://answers.opencv.org/question/63781/accumulateweighted-problems/< /а>

Утверждение не выполнено с accumulateWeighted в OpenCV

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

немного возможно полезной информации:

Первоначально Acc был основан на Gray_frame, но я понял, что дизайн этого метода зависит от глобального среднего значения, в результате чего дельта-кадр имеет контур исходного кадра во всех последующих кадрах. Поэтому я пытаюсь переделать его, чтобы придерживаться среднего глобального значения.

Каналы на все 3 (gray_frame, средний и акк) один. Глубина серого кадра остается равной 0. Глубина для среднего сначала равна 5 (после оператора if), затем 0, тогда как глубина Acc остается равной 5. Похоже, что основной цикл выполняется один раз, а затем завершается.

единичное среднее значение среднего до накопления взвешенного второго цикла такое же, как среднее значение первого. около 97,89

Всю программу C++ (работа в процессе) можно найти здесь: https://github.com/skewballfox/SauronsEye/blob/master/SauronsEye.cpp

Моя работа прошлым летом, которую я отчасти использую в качестве руководства (это было в основном для меня, чтобы попрактиковаться и никогда не предназначалось для просмотра, поэтому это немного беспорядочно): https://github.com/skewballfox/opencv-practice/blob/master/pi_surveillance.py


person Spider Jerusalem    schedule 27.12.2017    source источник
comment
Какой у вас актуальный вопрос? Вы спрашиваете, почему вы получаете ошибки утверждения?   -  person MFisherKDX    schedule 27.12.2017
comment
да, я знаю, что проблема связана с accumulateWeighted() из-за этих двух страниц, которые я нашел при первоначальной отладке: [stackoverflow.com/questions/7059817/ и тот, который указан в вопросе под ошибкой   -  person Spider Jerusalem    schedule 27.12.2017
comment
Я пытаюсь выяснить разницу между Acc (созданным на основе значений gray_frame и средним значением (инициализированным как пустая матрица, но сделанным как копия серого фрейма с плавающей точкой. Мне нужен этот метод для работы со средним значением, потому что мне нужно иметь скользящее среднее кадр, чтобы выяснить, движется ли что-нибудь в кадре.   -  person Spider Jerusalem    schedule 27.12.2017


Ответы (1)


Проблема заключается в том, что при масштабировании среднего в convertScaleAbs() тип среднего изменяется на 0 или CV_8U. это было исправлено путем создания пустого Mat() и сохранения результатов там, в отличие от самого среднего масштабирования:

Mat set_delta(Mat &average, Mat gray_frame)
{
    Mat delta_frame, scaled_average;
    //delta_frame is the storage for the difference between the accumulated average
    //and the current gray frame. scaled average is for storing the output of convertScaleAbs()
    //otherwise the depth of global average is 0 and causes an error on the second loop
    if (average.empty()==1)
    {
        gray_frame.convertTo(average, CV_32FC(gray_frame.channels()));
    }

    accumulateWeighted(gray_frame, average, .5);
    convertScaleAbs(average, scaled_average);
    absdiff(gray_frame,scaled_average,delta_frame);

    return delta_frame;
}
person Spider Jerusalem    schedule 27.12.2017