2015-06-07 8 views
0

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

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

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

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

код является

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

     // 
    } 

} 

им явно не использовать его right

ответ

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; 

}