maco1717
maco1717

Reputation: 843

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

Upvotes: 0

Views: 1646

Answers (1)

bendervader
bendervader

Reputation: 2660

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;

}

Upvotes: 1

Related Questions