2

カラー フレーム/画像を使用して SURF を実装できるように、このコードを使用して、Kalman_Color_Object_Trackのコードを使用して、カルマン フィルターによる色値を使用して検出されたオブジェクトを追跡しようとしています。したがって、これらは私がやろうとしている手順ですが、この SURF 検出コードはカラー画像を受け入れない/機能しないため、行き詰まっています。

  1. 「book1.png」はカラー画像です
  2. イメージの周囲の長方形が着信フレームから検出された後、Mat 構造体は IplImage に変更されます。これは、Kalman_Color_Object_Track コードが C++ で

    dest_image=cvCloneImage(&(IplImage)image);

    mat_frame=cvCloneImage(&(IplImage)frame);

  3. メソッドを呼び出しKalman_Color_Object_Track( mat_frame,dest_image,30);ます。

質問: (A) このコードを機能させて、カラー画像の SURF 特徴を抽出および検出できるようにするにはどうすればよいですか? (B) の関数シグネチャで何を渡す必要があるかわかりません。Kalman_Color_Object_Track()また、(C) オブジェクト検出モジュールのどこでそれを呼び出す必要がありますか?

     #include <stdio.h>
     #include <iostream>
     #include "opencv2/core/core.hpp"
     #include "opencv2/features2d/features2d.hpp"
     #include "opencv2/highgui/highgui.hpp"
     #include "opencv2/imgproc/imgproc.hpp"
     #include "opencv2/calib3d/calib3d.hpp"

    using namespace cv;
    IplImage *mat_dest_image=0;
    IplImage *mat_frame=0;
/* Object Detection and recognition from video*/



   int main()
    {
       Mat object = imread( "book1.png", );

        if( !object.data )
        {
            std::cout<< "Error reading object " << std::endl;
            return -1;
        }

        //Detect the keypoints using SURF Detector
        int minHessian = 500;

        SurfFeatureDetector detector( minHessian );
        std::vector<KeyPoint> kp_object;

        detector.detect( object, kp_object );

        //Calculate descriptors (feature vectors)
        SurfDescriptorExtractor extractor;
        Mat des_object;

        extractor.compute( object, kp_object, des_object );

        FlannBasedMatcher matcher;



        namedWindow("Good Matches");
    namedWindow("Tracking");

        std::vector<Point2f> obj_corners(4);

        //Get the corners from the object
        obj_corners[0] = cvPoint(0,0);
        obj_corners[1] = cvPoint( object.cols, 0 );
        obj_corners[2] = cvPoint( object.cols, object.rows );
        obj_corners[3] = cvPoint( 0, object.rows );

        char key = 'a';
        int framecount = 0;
           VideoCapture cap("booksvideo.avi");

           for(; ;)

       {
           Mat frame;
            cap >> frame;
            imshow("Good Matches", frame);


            Mat des_image, img_matches;
            std::vector<KeyPoint> kp_image;
            std::vector<vector<DMatch > > matches;
            std::vector<DMatch > good_matches;
            std::vector<Point2f> obj;
            std::vector<Point2f> scene;
            std::vector<Point2f> scene_corners(4);
            Mat H;
            Mat image;

            //cvtColor(frame, image, CV_RGB2GRAY);

            detector.detect( image, kp_image );
            extractor.compute( image, kp_image, des_image );

            matcher.knnMatch(des_object, des_image, matches, 2);

            for(int i = 0; i < min(des_image.rows-1,(int) matches.size()); i++) //THIS  LOOP IS SENSITIVE TO SEGFAULTS
            {
                if((matches[i][0].distance < 0.6*(matches[i][1].distance)) && ((int) matches[i].size()<=2 && (int) matches[i].size()>0))
                {
                    good_matches.push_back(matches[i][0]);
                }
            }

            //Draw only "good" matches
            drawMatches( object, kp_object, image, kp_image, good_matches, img_matches, Scalar::all(-1), Scalar::all(-1), vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );

            if (good_matches.size() >= 4)
            {
                for( int i = 0; i < good_matches.size(); i++ )
                {
                    //Get the keypoints from the good matches
                    obj.push_back( kp_object[ good_matches[i].queryIdx ].pt );
                    scene.push_back( kp_image[ good_matches[i].trainIdx ].pt );
                }

                H = findHomography( obj, scene, CV_RANSAC );

                perspectiveTransform( obj_corners, scene_corners, H);

                //Draw lines between the corners (the mapped object in the scene image )
                line( img_matches, scene_corners[0] + Point2f( object.cols, 0), scene_corners[1] + Point2f( object.cols, 0), Scalar(0, 255, 0), 4 );
                line( img_matches, scene_corners[1] + Point2f( object.cols, 0), scene_corners[2] + Point2f( object.cols, 0), Scalar( 0, 255, 0), 4 );
                line( img_matches, scene_corners[2] + Point2f( object.cols, 0), scene_corners[3] + Point2f( object.cols, 0), Scalar( 0, 255, 0), 4 );
                line( img_matches, scene_corners[3] + Point2f( object.cols, 0), scene_corners[0] + Point2f( object.cols, 0), Scalar( 0, 255, 0), 4 );
    mat_dest_image=cvCloneImage(&(IplImage)image);
    mat_frame=cvCloneImage(&(IplImage)frame);

    Kalman_Color_Object_Track( ); // The tracking method
            }

            //Show detected matches
            imshow( "Good Matches", img_matches );
            for( int i = 0; i < good_matches.size(); i++ )
    { printf( "-- Good Match [%d] Keypoint 1: %d  -- Keypoint 2: %d  \n", i,    good_matches[i].queryIdx, good_matches[i].trainIdx ); }
            waitKey(0);

       }
        return 0;

    }
4

1 に答える 1

1

この論文では、各チャネルの勾配ヒストグラムを個別に計算することにより、カラー画像に SIFT 記述子を実装しました。おそらく、SURF 機能に対して同じアプローチを試すことができます。

于 2013-02-14T22:06:01.950 に答える