Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://yahirohumpty.blog2.fc2.com/tb.php/268-b8ed13f0

-件のトラックバック

-件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

OpenCV + KLT

調子がすぐれないが,あまり寝込んでもいられないので.
長いので追記に詳細を書きたいと思います.

ここでやりたいことを大雑把に言うと,

「Webカメラで取ってきた映像の中で同じ点を連続で追跡したい」

ということで,その目標を解決するために,

  • OpenCVによるキャプチャ

  • KLT Trackerによる特徴点追跡


を実現します.
on Win32 using VC++

あくまで自分用メモなんでわかりにくいかもしれませんがよければどうぞ.

さて,まずは以前の記事でも書いたように,
OpenCVをインストールして
http://opencv.jp/sample/video_io.html#capture
のサンプルコードが動くようにしておきます.
ここの時点で前者の目標は達成されます.

本題は後者です.まず,
KLT: Kanade-Lucas-Tomasi Feature Tracker
http://www.ces.clemson.edu/~stb/klt/
からObtaining and Installing the Code->Download the version you want:
をたどってzipを入手し解凍.
中にslnが入っているので,これを使ってdllとlibを作っておきます.

何か色々めんどくさいのですが,
express editionの場合だとプロジェクトのプロパティから
ターゲットが.exeになっているところを{dll,lib}に変更し,
出力ファイル名も適宜変更し,
実行ファイル用のソースであるmain.cpp,example*.cをプロジェクトから抜いて
ビルドすれば普通にできました.

で,できたらdllとlibをパスの通っているところ(作ろうとするプログラムのカレントでも可)にコピー.
*.hを例えばカレントのklt/の下にコピー.
これで下準備は完了.
あとはOpenCVのサンプルを次のように改造して,チェック.


#include <cv.h>
#include <highgui.h>
#include <ctype.h>

#include "klt/klt.h"
#pragma comment(lib,"Klt.lib")

int main (int argc, char **argv){
CvCapture *capture = 0;
IplImage *frame = 0;
IplImage *img;
double w = 320, h = 240;
int width=320,height=240;
int c;

KLT_TrackingContext tc;
KLT_FeatureList fl;
int nFeatures = 100;
int ncols, nrows;
int i,xidx;
int xx,yy;

unsigned char *buf,*gbuf,*ogbuf;

tc = KLTCreateTrackingContext();
tc->sequentialMode=TRUE;
KLTPrintTrackingContext(tc);
fl = KLTCreateFeatureList(nFeatures);

// (1)コマンド引数によって指定された番号のカメラに対するキャプチャ構造体を作成する
if (argc == 1 || (argc == 2 && strlen (argv[1]) == 1 && isdigit (argv[1][0])))
capture = cvCreateCameraCapture (argc == 2 ? argv[1][0] - '0' : 0); /* この設定は,利用するカメラに依存する */
// (2)キャプチャサイズを設定する.
cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH, w);
cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT, h);
cvNamedWindow ("Capture", CV_WINDOW_AUTOSIZE);

frame = cvQueryFrame (capture);
img=cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,3);
buf=img->imageData;
gbuf=(unsigned char *)malloc((int)(w*h));
ogbuf=(unsigned char *)malloc((int)(w*h));

for(i=0;i<width*height;i++){
xidx=i*3;
ogbuf[i]=(unsigned char)(((3*buf[xidx]+6*buf[xidx+1]+buf[xidx+2])/10));
}
KLTSelectGoodFeatures(tc,ogbuf,width,height,fl);

// (3)カメラから画像をキャプチャする
while (1) {
frame = cvQueryFrame (capture);
cvCopy(frame,img,NULL);

//grayscale
for(i=0;i<width*height;i++){
xidx=i*3;
gbuf[i]=(unsigned char)(((3*buf[xidx]+6*buf[xidx+1]+buf[xidx+2])/10));
}

KLTTrackFeatures(tc,ogbuf,gbuf,width,height,fl);
KLTReplaceLostFeatures(tc,gbuf,width,height,fl);

for(i=0;i<nFeatures;i++){
xx=(int)(fl->feature[i]->x+0.5);
yy=(int)(fl->feature[i]->y+0.5);
if(fl->feature[i]->val==0.0){
cvRectangle(img,cvPoint(xx-2,yy-2),cvPoint(xx+2,yy+2),CV_RGB(255,0,0),1,8,0);
}else{
cvRectangle(img,cvPoint(xx-2,yy-2),cvPoint(xx+2,yy+2),CV_RGB(255,255,0),1,8,0);
}
}

cvShowImage ("Capture", img);

for(i=0;i<width*height;i++)ogbuf[i]=gbuf[i];

c = cvWaitKey (10);
if (c == '\x1b')
break;
}
cvReleaseCapture (&capture);
cvReleaseImage(&img);
cvDestroyWindow ("Capture");

KLTFreeFeatureList(fl);
KLTFreeTrackingContext(tc);

free(gbuf);
free(ogbuf);

return 0;
}


汚らしい上に解放忘れとかあるかもしれませんが,
手元で確認したところきちんと追跡できました.

あとは機能としてはキャリブとか八点法とか仕込んでみますかね.
ソース全体の直しとしてはglut導入とかカメラの扱いをDirectShowにするとか
いろいろやっておきたい.
スポンサーサイト
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://yahirohumpty.blog2.fc2.com/tb.php/268-b8ed13f0

0件のトラックバック

0件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

Appendix

プロフィール

yahirohumpty

  • Author:yahirohumpty
  • 某大学の研究員です.
    博士号持ってます.
    ビジョンとロボットが専門.
    その他もろもろのことに興味があります.

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。