Search code examples
c++opencvmotion

OpenCV cpp motion detection


I'm trying to figure out how motion detection work in opencv.

I can see there the video analysis reference but I don't find enough information about how this is used.

I've also seen some people using absdiff I tried it like this, but It gives me an exception at memore errors

OpenCV Error: Sizes of input arguments do not match (The operation is neither 'a rray op array' (where arrays have the same size and the same number of channels) , nor 'array op scalar', nor 'scalar op array') in cv::arithm_op, file C:\builds \2_4_PackSlave-win32-vc12-shared\opencv\modules\core\src\arithm.cpp, line 1287

the code is

#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);

        //
    }

}

im obviously not using it right


Solution

  • You need to confirm the VideoCapture was successful before using the images. Also, you want to test if the image was captured successfully before using it. Try this:

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