OpenCV/Good Features to Track

Last-modified: 2006-12-16 (土) 22:28:58

説明

  • cvGoodFeaturesToTrack のサンプル
  • 特徴点を取り続けるのみ。トラッキングは行っていない。

スクリーンショット

20061215.jpg


cvGoodFeaturesToTrack

void cvGoodFeaturesToTrack( const CvArr* image,
                                      CvArr* eig_image,
                                      CvArr* temp_image,
                                      CvPoint2D32f* corners,
                                      int* corner_count,
                                      double quality_level,
                                      double min_distance,
                                      const CvArr* mask=NULL,
                                      int block_size=3,
                                      int use_harris=0,
                                      double k=0.04 );
image
入力画像.
eig_image
一時的な処理用画像格納メモリ.32fで入力と同じサイズ.
ex. cvCreateImage( cvGetSize(image), 32, 1 );
temp_image
eig_imageと同じ
corners
処理の結果.コーナーの位置.
corner_count
処理の結果.コーナーの数.
quality_level
最大最小固有地の乗数(?).どのくらいのレベルをコーナーとするか.
付属のサンプルでは0.01だった.
min_distance
コーナー間の距離の最小値.
mask
指定した場合,そのROIに絞って処理を行う.
block_size
cvCornerMinEigenVal か cvCornerHarris に渡されるパラメータ.
use_harris
0以外を指定すると, cvCornerHarris を cvCornerMinEigenVal の代わりに使用する.
k
cvCornerHarris を使う場合のパラメータ.

filemain.cpp

//==============================================================================
//?C???N???[?h
//==============================================================================
#include "cv.h"
#include "highgui.h"
#include <stdio.h>

// ???C?u??????????
#pragma comment(lib,"cv.lib")
#pragma comment(lib,"cxcore.lib")
#pragma comment(lib,"cvaux.lib")
#pragma comment(lib,"highgui.lib")

//GoodFeatureToTrack?????
#define MAX_COUNT       100     //?R?[?i?[?????
#define QUALITY         0.01
#define MIN_DISTANCE    10      //?R?[?i?[????????
#define WIN_SIZE        15

//==============================================================================
//???C??
//==============================================================================
int main( int argc, char** argv )
{
    IplImage* frame;    //?L???v?`???p
    IplImage* image;    //?\ヲ?p
    IplImage* gray;     //GRAY
    CvCapture *capture;
    char* window_name = "Good Feature To Track";
    CvPoint2D32f points[MAX_COUNT];

    capture = cvCaptureFromCAM(-1);

    //?J??????????????
    if(capture==NULL)	{
        printf("No Camera is Found.\n");
        return -1;
    }

    //?E?C???h?E???
    cvNamedWindow(window_name, 1);

    //????L???v?`????????A??????mage???`
    frame = cvQueryFrame(capture);
    image = cvCloneImage(frame);
    gray = cvCreateImage(cvGetSize(image), 8, 1);

    //?????[?v
    while(1)
    {
        //?L???v?`?????mage??R?s?[
        frame = cvQueryFrame(capture);
        cvCopy(frame, image);

        //?O???C??
        cvCvtColor(image, gray, CV_BGR2GRAY);

        //???_????g?p????????`
        IplImage* eig = cvCreateImage( cvGetSize(gray), 32, 1 );
        IplImage* temp = cvCreateImage( cvGetSize(gray), 32, 1 );
        int count = MAX_COUNT;
        double quality = QUALITY;
        double min_distance = MIN_DISTANCE;
        int win_size = WIN_SIZE;

        //???_??????
        cvGoodFeaturesToTrack( gray, eig, temp, points, &count,
            quality, min_distance, NULL, 3, 0, 0.04 );

        //???_???x?????
        cvFindCornerSubPix( gray, points, count,
            cvSize(win_size,win_size), cvSize(-1,-1),
            cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,20,0.03));

        cvReleaseImage( &eig );
        cvReleaseImage( &temp );

        //???_??`????
        int dx=10, dy=10;   //?`????l?p??T?C?Y
        for(int i=0; i<count; i++) {
            cvRectangle(image, cvPoint(points[i].x-win_size/2,points[i].y-win_size/2),
                cvPoint(points[i].x+win_size/2,points[i].y+win_size/2), CV_RGB(0,255,0));
            cvCircle(image, cvPointFrom32f(points[i]), 1, CV_RGB(255,0,0), -1, 8, 0);
        }

        //?L?[??????
        int c = cvWaitKey(10);
        if( (char)c == 27 ) {   //Ecs?L?[??I??
            break;
        }

        //?????\ヲ
        cvShowImage(window_name, image);
    }

    //???
    cvDestroyWindow(window_name);
    cvReleaseImage(&image);
    cvReleaseImage(&gray);

    return 0;
}