2012-04-02 19 views
1

私はビデオ監視のプロジェクトを行っています。
RGBからグレーへの変換が見えません。私は灰色の黒い窓を得る。
問題を手伝ってもらえますか?
また、現在のフレームと前のフレームの違いをどのように取得できますか?
ありがとうございました。 IlanOpenCV RGB to gray

#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* gray = cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,1); 
    cvCvtColor(frame, gray, CV_RGB2GRAY); 

     if (!capture) 

    { 
     fprintf(stderr, "Cannot open AVI!\n"); 
     return 1; 
     } 
      int fps = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FPS); 

      cvNamedWindow("video", CV_WINDOW_AUTOSIZE); 
     cvNamedWindow("grayvideo", CV_WINDOW_AUTOSIZE); 

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




    if(key==27)break; 
    cvShowImage("video",frame); 
    cvShowImage("grayvideo",gray); 


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

    return 0; 
} 
+0

あなたがC++ OpenCVのAPIを学ぶ必要があります。独自のデストラクタ(および参照カウンタ)を持つ画像にcv :: Matオブジェクトを使用すると、手動でIplImageを解放する必要はありません。*あなたのコードでは忘れてしまったものです。 – Eric

+0

この質問に回答した場合は、近くのチェックボックスをオンにして公式の回答を選択することを検討してください。そうでない場合は、独自の回答を追加することを検討してください。 – karlphillip

答えて

3

各フレームをカラーからグレースケールに変換する必要があります。あなたが最初にそれをやるならば、それは自動的に変換されません。だから、cvQueryFrameにお電話した後、あなたのwhileループに

cvCvtColor(frame, gray, CV_BGR2GRAY); 

を追加する必要があります。

+0

ありがとうございます:) –

+0

このコードでは、現在のフレームと前のフレームとの間に違いがありますか?どのように私は現在のフレームから前のものを減らし、結果をウィンドウに表示するのですか? –

+0

私は、BGRがOpenCVのデフォルトのピクセルフォーマットであることを確信しています。私はCV_RGB2GRAYを使用する例がほとんどですが、imho(私が間違っていない限り)CV_BGR2GRAYを使用する方が良いでしょう。 –

1

コードにはいくつか問題がありました。

  • これは混乱しており、
  • 関数の戻り値を確認する必要がある場合は、関数呼び出し直後に関数を呼び出す必要があります。例:cvCaptureFromAVI();
  • cvQueryFrame()が失敗する可能性があるため、返品も確認する必要があります。
  • 灰色のフレームを表示する前に、RGB→グレー変換を実行するのを忘れた:cvCvtColor(frame, gray, CV_RGB2GRAY);
  • また、grayvideoウィンドウのリソースを解放するのを忘れました。

このように見えるコードを読みやすく/理解するのは簡単ではありませんか?

int main() 
{  
    CvCapture* capture = cvCaptureFromAVI("macroblock.mpg"); 
    if (!capture) 
    { 
     fprintf(stderr, "Cannot open AVI!\n"); 
     return 1; 
    } 

    int fps = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FPS); 
    printf("FPS: %d\n", fps); 

    cvNamedWindow("video", CV_WINDOW_AUTOSIZE); 
    cvNamedWindow("grayvideo", CV_WINDOW_AUTOSIZE); 

    int key = 0; 
    IplImage* gray = NULL; 
    IplImage* prev_frame = NULL; 

    while(key != 'x') 
    { 
     frame = cvQueryFrame(capture); 
     if (!frame) 
     { 
      // print error and abort the loop 
      break; 
     } 

     cvShowImage("video", frame); 

     if (!gray) // allocate space for the GRAY frame only once 
     { 
      gray = cvCreateImage(cvGetSize(frame), frame->depth,1); 
     } 
     cvCvtColor(frame, gray, CV_RGB2GRAY); // convert RGB frame to GRAY 
     cvShowImage("grayvideo", gray); 

     if (!prev_frame) // allocate space for the GRAY frame only once 
     { 
      prev_frame = cvCreateImage(cvGetSize(frame), frame->depth,1); 
      cvCopy(frame, prev_frame, 0); 
     } 

     // perform process to compute the "difference" of the current 
     // and previous frames: 
     // <add your code here> 

     // then, update prev_frame now so in the next iteration it holds the previous frame 
     cvCopy(frame, prev_frame, 0); 

     key = cvWaitKey(1000/fps); 
     if (key==27) // ESC was pressed 
      break; 
    } 

    cvDestroyWindow("video"); 
    cvDestroyWindow("grayvideo"); 

    cvReleaseCapture(&capture); 

    if (gray) 
     cvReleaseImage(&gray); 

    if (prev_frame) 
     cvReleaseImage(&prev_frame); 

    return 0; 
} 
+0

はい、このコードは実行されていません –

+0

あなたは2つのフレーム、例えば現在のフレームと前のフレームとの違いをどうやって考えていますか?ありがとうございました –

+0

私はちょうど前のフレームを格納するコードを更新しました。 2つのフレーム間の*差*の計算は、それがあなたに意味するものであれ、書かれる必要があります。このフォーラムのフレームの違いを検出する方法については、たくさんの質問があります。検索ボックスを使用して、適切なテクニックを見つけることができます。がんばろう。 – karlphillip

0

あなたに基づいて使用opencv以下の関数のいずれかが必要です。

subtract(img_current,img_prev, img_diff); 
absdiff(img_current, img_prev, img_diff); 
+1

こんにちは、Dawit、あなたはちょっとした詳細やコードの説明を提供できますか? – furins

関連する問題