Обнаружение движения OpenCV cpp

Я пытаюсь понять, как работает обнаружение движения в opencv.

Я вижу там ссылку на анализ видео, но я не нахожу достаточно информации о том, как это используется.

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

Ошибка OpenCV: размеры входных аргументов не совпадают (операция не является ни «массивом операций массива» (где массивы имеют одинаковый размер и одинаковое количество каналов), ни «скалярным массивом операций», ни «скалярным массивом операций») в cv::arithm_op, файл C:\builds\2_4_PackSlave-win32-vc12-shared\opencv\modules\core\src\arithm.cpp, строка 1287

код

#include <iostream>
#include <sstream>
#include <string>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;
using namespace std;

int main()
{
    //create matrix for storage
    Mat image;
    Mat image2;
    Mat image3;
    Mat image4;

    //initialize capture
    VideoCapture cap;
    cap.open(0);

    //create window to show image
    namedWindow("window", 1);

    while (1){

        //copy webcam stream to image
        cap >> image;
        cap >> image2;

        absdiff(image, image2, image3);
        threshold(image3, image4, 128, 255, THRESH_BINARY);


        //print image to screen
        if (!image.empty()) {

            imshow("window", image3);

        }

        //delay33ms

        waitKey(10);

        //
    }

}

я явно не правильно его использую


person maco1717    schedule 07.06.2015    source источник


Ответы (1)


Вы должны подтвердить, что VideoCapture был успешным, прежде чем использовать изображения. Кроме того, вы хотите проверить, было ли изображение успешно захвачено, прежде чем использовать его. Попробуй это:

VideoCapture cap(0);

if(!cap.isOpened()) {
  std::cerr << "Failed to open video capture" << std::endl;
  return -1;
}

namedWindow("window");

while(true) {
    cap >> image;
    cap >> image2;

    if(image.empty() || image2.empty()) {
        std::cerr << "failed to capture images\n";
        return -1;
    }

    absdiff(image, image2, image3);
    threshold(image3, image4, 128, 255, THRESH_BINARY);

    imshow("window", image);
    int k = waitKey(30) & 0xff;
    if('q' == k || 27 == k)
       break;

}
person bendervader    schedule 07.06.2015