OpenCV cpp运动检测

时间:2015-06-07 19:00:43

标签: c++ opencv motion

我试图弄清楚运动检测在opencv中是如何工作的。

我可以在那里看到视频分析参考,但我找不到有关如何使用它的足够信息。

我也看到有些人使用absdiff我试过这样,但它在memore错误中给了我一个例外

  

OpenCV错误:输入参数的大小不匹配(操作既不是' a   rray op array' (其中数组具有相同的大小和相同数量的通道)   ,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);

        //
    }

}

我显然没有正确使用它

1 个答案:

答案 0 :(得分: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;

}