説明
- cvGoodFeaturesToTrack のサンプル
- 特徴点を取り続けるのみ。トラッキングは行っていない。
スクリーンショット
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 を使う場合のパラメータ.
//==============================================================================
//?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;
}