2012-04-03 16 views
3

OpenCVでビデオを実行しているときのフレームの違いを知るにはどうすればよいですか?フレームごとの変更をチェックし、結果を別のウィンドウに表示するループを実行する必要がありますか? ここに添付したループでそれを行うことはできますか?それとももう一つの方法がありますか?OpenCVを使ってフレーム間の違いを見つける方法は?

while(key != 'x') 
{ 
    frame = cvQueryFrame(capture); 
    cvCvtColor(frame, gray, CV_RGB2GRAY); 

    //gray_frame = cvQueryFrame(capture); 

    //cvCvtColor(frame, gray_frame, CV_BGR2GRAY); 

    if(key==27) 
     break; 

    cvShowImage("video",frame); 
    cvShowImage("grayvideo",gray); 

    key = cvWaitKey(1000/fps); 
} 
cvDestroyWindow("video"); 
cvDestroyWindow("grayvideo"); 
cvReleaseCapture(&capture); 

return 0; 

私は、コマンドウィンドウで、このエラーを取得する:コンパイラは、スタック変数を合わせていませんでした。 Libavcodecは にコンパイルされており、非常に遅いかクラッシュする可能性があります。これはlibavcodecのバグではなく、 ですが、コンパイラにあります。 gcc> = 4.2を使って再コンパイルしてみてください。 FFmpeg開発者にクラッシュを報告しないでください。 OpenCVエラー:アサーションに失敗しました(src1.size()== dst.size()& & src1.type()== dst。 未知の関数でファイル........ \ ocv \ opencv \ src \ cxcore \ cxarithm.cpp 、行1563

mabyのmabyの深さのサイズは何ですか? どうすれば修正できますか?またはmabyのコードに何か問題がありますか? あなたの助けをたくさんありがとう

+0

他の質問を確認し、解決した回答を受け入れてください。それぞれの答えの近くに小さなチェックボックスがあり、それをクリックして正式な答えを選択することができます。この方法でコミュニティを手助けしています。 – karlphillip

+0

類似画像(オブジェクトシーン)の違いの度合いを意味するのか、Diff = frame [N] - frame [N + 1]のような差分画像を計算したいだけですか? あなたの質問を明確にすることができます – dervish

答えて

1

フレームの違いには簡単なアプローチがありますが、私はOpenCVからMotion Templateサンプルをチェックすることをお勧めします。 OpenCVversion \ samples \ c \ motempl.exeにあります。これは差をつける高度な方法であり、それがあなたが興味を持っているかもしれません。

これをフレーム減算で実行したい場合は、別のIplImageを作成して最後のフレームを保存し、そのフレームから現在のフレームを減算する必要があります。また、結果を見るための別のウィンドウを作成することを確認してください。

減算については、postをご覧ください。

あなたのコードは次の擬似コードのようになります。私はそれが役に立てば幸い

allocate space for frame, oldFrame and destinationFrame, all the same size/type. 

while(1){  
    copy current frame to oldFrame 
    grab new frame in frame 

    cvSub(frame,oldFrame,dest) 

    cvShow(dest) 

}

敬具、 ダニエル

+0

こんにちは、こんにちは、このようにしてみました: –

0

これはあなたのアドバイスから、新しいコードでは:

#include "stdafx.h" 
#include <stdio.h> // For printf 
#include <cv.h> 
#include <cxcore.h> 
#include <highgui.h>  

int main() 
{ 


    int key = 0; 




    CvCapture* capture = cvCaptureFromAVI("macroblock.mpg"); 
    IplImage* frame = cvQueryFrame(capture); 
    IplImage* currframe = cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,1); 
    IplImage* destframe = cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,1); 

     if (!capture) 

    { 
     fprintf(stderr, "Cannot open AVI!\n"); 
     return 1; 
     } 

     int fps = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FPS); 

     cvNamedWindow("dest", CV_WINDOW_AUTOSIZE); 

     while(key != 'x') 
      { 
       frame = cvQueryFrame(capture); 
     currframe = cvCloneImage(frame); 
     frame = cvQueryFrame(capture); 



       cvSub(frame,currframe,destframe); 

       if(key==27)break; 
       cvShowImage("dest",destframe); 
       key = cvWaitKey(1000/fps); 
       } 
      cvDestroyWindow("dest"); 
      cvReleaseCapture(&capture); 
      return 0; 
} 
3

次の2つのマットオブジェクト/ポインタを減算することができます。

Mat prev_frame; 
cap.read(prev_frame); 

while (1) 
{ 
    Mat frame; 
    cap.read(frame); 

    Mat dif = frame - prev_frame; 
    imshow("difference", dif); 

    // you can also use absdiff 
    //absdiff(frame, prev_frame, dif); 

    prev_frame = frame.clone(); 
} 
関連する問題