OpenCV/KLT Feature Tracker

Last-modified: 2006-12-15 (金) 10:52:48

説明

  • Kanade-Lucas-Tomasi Feature Tracker をOpenCVで扱うための第一段階。
  • カメラからの入力画像に特徴点を描画して表示するのみ。

スクリーンショット

20061214-1.JPG


ref

filemain.cpp

// KLT include
#include "pnmio.h"
#include "klt.h"

// OpenCV include
#include <cv.h>
#include <highgui.h>

// OpenCV libs
#pragma comment(lib,"cxcore.lib")
#pragma comment(lib,"cv.lib")
#pragma comment(lib,"cvaux.lib")
#pragma comment(lib,"highgui.lib")

//???
#define CAPTURE_SIZE_X 320
#define CAPTURE_SIZE_Y 240

//?O???[?o?????
CvCapture* capture;
IplImage* frame;
IplImage* image;
IplImage* disp_image;

//??????????o?b?t?@??A?L???v?`???????O???C????l?????
void Capture(unsigned char* buffer)
{
    //?L???v?`??
    frame = cvQueryFrame(capture);
    cvFlip(frame, frame);    //???]
    //?O???C??
    cvCvtColor(frame, image, CV_BGR2GRAY);

    //?o?b?t?@??i?[
    for(int y=0; y<image->height; y++) {
        for(int x=0; x<image->width; x++) {
            buffer[y*image->width+x] =
                image->imageData[y *image->widthStep+ x * image->nChannels];
        }
    }
}

int main()
{
    //for KTL
    unsigned char *img;
    KLT_TrackingContext tc;
    KLT_FeatureList fl;
    int nFeatures = 100;
    int ncols=CAPTURE_SIZE_X;
    int nrows=CAPTURE_SIZE_Y;
    //for OpenCV
    int key;
    char* window_name ="Capture";

    //?J????????
    capture = cvCaptureFromCAM(-1);
    frame = cvQueryFrame(capture);

    //IplImage??????
    image = cvCreateImage(cvGetSize(frame), 8, 1);      // ???_???p
    disp_image = cvCreateImage(cvGetSize(frame), 8, 3); // ???\ヲ?p

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

    //?o?b?t?@??m??
    img = new unsigned char[nrows*ncols];

    //KLT??W??????
    tc = KLTCreateTrackingContext();
    KLTPrintTrackingContext(tc);
    fl = KLTCreateFeatureList(nFeatures);

    while(1){
        //?L???v?`??
        Capture(img);
        //???_???
        KLTSelectGoodFeatures(tc, img, ncols, nrows, fl);

        //?L???v?`???????R?s?[
        cvCopy(frame, disp_image);

        //???_??\ヲ?p?????`??
        for(int feat=0; feat<fl->nFeatures; feat++) {
            cvCircle(disp_image,
                cvPoint(fl->feature[feat]->x, fl->feature[feat]->y),
                1, CV_RGB(255,0,0), 3);
        }

        //?L?[??
        key = cvWaitKey(10);
        if( (char)key == 27 ) { // Esc
            break;
        }

        //?E?C???h?E??\ヲ
        cvShowImage(window_name, disp_image);
    }

    //?o?b?t?@?J??
    delete img;
    return 0;
}