説明
- Kanade-Lucas-Tomasi Feature Tracker をOpenCVで扱うための第一段階。
- カメラからの入力画像に特徴点を描画して表示するのみ。
スクリーンショット
ref
// 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;
}