2016-04-25 8 views
1

ウェブカメラから撮影された2つの連続する画像を差し引きたい。 私はこれをwhileループの中でやっています。 whileループの最後の行ではframe2 = frameを設定していますので、次の繰り返しからそれらを減算することができます。しかし関数cv :: subtractは端末で上記のエラーを返します。なぜ関数cv :: subtract()は "入力引数のサイズが一致しません"というエラーを返しますか?

何が間違っていますか?

#include <iostream> 
#include "core.hpp" 
#include "highgui.hpp" 
#include "imgcodecs.hpp" 
#include "cv.h" 

using namespace std; 
using namespace cv; 


int main(int argc, char* argv[]) 
{ 

    VideoCapture cap(0); ///open the video camera no. 0 (laptop's default camera) 

    ///make a writer object: 
    cv::VideoWriter writer; 

    if (!cap.isOpened()) /// if not success, exit program 
    { 
     cout << "ERROR INITIALIZING VIDEO CAPTURE" << endl; 
     return -1; 
    } 

    char* windowName = "Webcam Feed(diff image)"; 
    namedWindow(windowName,WINDOW_NORMAL); ///create a window to display our webcam feed 


    ///we need to define 4 arguments for initializing the writer object: 
    //filename string: 
    string filename = "C:\\Users\\PEYMAN\\Desktop\\ForegroundExtraction\\openCV_tutorial\\2.writing from video to file\\Payman.avi"; 

    //fourcc integer: 
    int fcc = CV_FOURCC('D','I','V','3'); 

    //frame per sec integer: 
    int fps = 10; 

    //frame size: 
    cv::Size framesize(cap.get(CV_CAP_PROP_FRAME_WIDTH),cap.get(CV_CAP_PROP_FRAME_HEIGHT)); 


    ///initialize the writet object: 
    writer = VideoWriter(filename,fcc,fps,framesize); 

    if(!writer.isOpened()){ 

     cout << "Error opening the file" << endl; 
     getchar(); 
     return -1; 
    } 

    int counter = 0; 
    while (1) { 

     Mat frame,frame2,diff_frame; 


     ///read a new frame from camera feed and save it to the variable frame: 
     bool bSuccess = cap.read(frame); 



     if (!bSuccess) ///test if frame successfully read 
     { 
      cout << "ERROR READING FRAME FROM CAMERA FEED" << endl; 
      break; 
     } 

     /// now the last read frame is stored in the variable frame and here it is written to the file: 
     writer.write(frame); 

     if (counter > 0){ 

      cv::subtract(frame2,frame,diff_frame); 
      imshow(windowName, diff_frame); ///show the frame in "MyVideo" window 

     } 

     ///wait for 10ms for a key to be pressed 
     switch(waitKey(1)){ 

     ///the writing from webcam feed will go on until the user presses "esc": 
     case 27: 
      ///'esc' has been pressed (ASCII value for 'esc' is 27) 
      ///exit program. 
      return 0; 

     } 

    frame2 = frame; 
    counter++; 
    } 

    return 0; 

} 
+0

フレームをコピーするときにframe2 = frame.clone()を使用してみます。 'cv :: subtract(不要) – rhcpfan

+1

@rhcpfanのほうが、' cv:swap(frame、frame2); 'を使うのではなく' frame2 = frame2 - frame'または 'frame2 - –

答えて

2

whileループを実行するたびにframe2が作成され、デフォルトで初期化されます。あなたは

cv::subtract(frame2,frame,diff_frame); 

を呼び出すときは、その中に画像を持っているMatからMatを構築し、デフォルトを減算しようとしています。これら2つのMatは同じサイズではありませんので、エラーが発生します。

whileループの実行ごとに値を保持したい場合は、frameframe2の宣言をwhileループの外側に移動する必要があります。また、最初にsubtractを使用できるように、同じサイズにframe2を初期化するか、2番目の画像を取り込む必要があります。

2

counterのように、をwhileループの範囲外に宣言する必要があります。今、ループの繰り返しごとに新しく空のframe2が得られます。

メモリは、各反復の終了時に割り当て解除されなければならないと再割り当て次しないように、これはエラーではないがあなたにも、whileループ外全てMat Sを移動させる可能性があるとこの場合、パフォーマンスのペナルティは表示されません。

また、@ rhcpfanは、浅いvs深いコピーに注意する必要があるという点で、正しく機能します。 cv::swap(frame, fram2)を使用してください。

関連する問題