2016-05-11 4 views
2

を表示するために、画像のマットを保存し、検出は、ビデオストリーム上で行われます。 Haarが何かを検出すると、これは次のようになります。Mat faceROI = frame_gray(faces[i]); imshow("Detection", faceROI);ハール検出 - 取得し、私は私の趣味のプロジェクトでハール検出を使用していた前フレーム

動画が再生されている間に検出が行われ、Matがオブジェクトの新しい画像で更新/上書きされています。私が今したいのは、Matを保存して、新しい検出が発生したときにと前のと現フレームの両方を取得することです。私はMatを何らかの方法で保存してからそれを更新する必要があると思います。現在 - >前などです。

imshow("Previous detection", previousROI);` <- want to be able to do this 

あなたが全体のコードを見たい場合は、私はこれをやっている:http://docs.opencv.org/2.4/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.html

ヘルプははるかに高く評価されます!

+0

したがって、 'faceROI'は、そのフレーム内の顔の一方のROIであり、それは今、同じフレーム内の異なる顔を見ているため、ループの反復のためにそれぞれを再宣言だ理由です。 そのフレームにある顔のすべてのROIを持つ画像を取得しようとしていますか?または、次のフレームのすべてのfaceROIにあるフレームのすべてのfaceROIを比較しようとしていますか? グローバル 'マットpreviousROI'と' clone'-INGのimshows後faceROI' 'から、それが動作するはずのセットアップ、2フレーム目faceROIsに1フレーム内のすべてのfaceROIsを比較しようとしている場合は(目になりますしかし、まだそこにいる) –

+0

@ RachelL 1. "あなたは、そのフレーム内の顔のすべてのROIを持つ画像を取得しようとしていますか?"いいえ、私は一度に1つずつ気にします。 2. "あなたは、次のフレームのすべてのfaceROIにあるフレームのすべてのfaceROIを比較しようとしていますか?"それもやっていませんが、後でやるので、前のフレームを保存します。 3.「あるフレーム内のすべてのfaceROIを2番目のフレームのfaceROIと比較しようとしている場合は、グローバルなMat previousROIを設定し、faceROIからクローン化してください。」と私は後で比較しようとしますが、 ** 1 **前のフレームを保存する必要があります。 4.目=私はそれを使わない –

+0

@レイチェルなのでクローニングとショーは私の問題を解決しないので良い解決策だとは思わない。前の画像/フレームは何とか​​保存する必要があります。 –

答えて

1

検出/表示を別の機能に分割しないと、時間がかかることがあります。私は以下のOpenCVのドキュメントコードを変更しました。私はこれをコンパイルまたは実行していないので、いくつかのエラーがあるかもしれないことを覚えておいてください。しかし、問題に対処するための別の方法のアイディアを与えるべきです。

/** @function main */ 
int main(int argc, const char** argv) 
{ 
    CvCapture* capture; 
    Mat frame; 

    //-- 1. Load the cascades 
    if(!face_cascade.load(face_cascade_name)){ printf("--(!)Error loading\n"); return -1; }; 
    if(!eyes_cascade.load(eyes_cascade_name)){ printf("--(!)Error loading\n"); return -1; }; 

    //-- 2. Read the video stream 
    capture = cvCaptureFromCAM(-1); 
    if(capture) 
    { 
     //store faces here 
     std::vector<Mat> prev_faces; 
     std::vector<Mat> current_faces; 

     while(true) 
     { 
      frame = cvQueryFrame(capture); 

      //-- 3. Apply the classifier to the frame 
      if(!frame.empty()) 
      { 
       std::vector<Rect> faces; 
       Mat frame_gray; 

       cvtColor(frame, frame_gray, CV_BGR2GRAY); 
       equalizeHist(frame_gray, frame_gray); 

       //-- Detect faces 
       face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30)); 

       for(size_t i = 0; i < faces.size(); i++) 
       { 
        Mat faceROI = frame_gray(faces[i]); 
        current_faces.push_back(faceROI); //adds all of the current detections to a vector 
       } 

       if (prev_faces.size() > 0 && current_faces.size() > 0) 
       { 
        // do stuff with prev_faces and current_faces 
        // for(int i = 0; i < prev_faces.size(); i++){ 
        //  imshow("previous", prev_faces[i]) 
        // } 
        // for(int i = 0; i < prev_faces.size(); i++){ 
        //  imshow("current", current_faces[i]) 
        // } 
        // imshow("stuff", other_cool_Mats_I_made_by_analysing_and_comparing_prev_and_current) 
       } 
       prev_faces = current_faces; 
       current_faces.erase(current_faces.begin(), current_faces.end()); 

      else 
      { printf(" --(!) No captured frame -- Break!"); break; } 

      int c = waitKey(10); 
      if((char)c == 'c') { break; } 
     } 
    } 
    return 0; 
} 
+0

試してみましたが、それは動作しますが、実際には私が望む通りではありません。 –

+0

あなたの完全な意図を知らないので、私は '* _faces.size()> 0'の任意の条件を追加しました。おそらくそれ(またはあなたが含むかもしれない他の条件)は、あなたのコードがどのように実行されるかに影響します。これは最高の推測ですが、コードを見ずにデバッグするのは難しいです。 – BHawk

関連する問題