#include <stdio.h>//for printf()
#include <cv.h>
#include <highgui.h>
int
main (int argc, char **argv)
{
CvCapture *capture;//(add.1)
char *status;
int i, corner_count = 150;
CvPoint2D32f *corners1, *corners2;
CvTermCriteria criteria;
IplImage *src_img1, *src_img2, *dst_img;
IplImage *eig_img, *temp_img;
IplImage *prev_pyramid, *curr_pyramid;
IplImage *tmp;
capture = cvCreateCameraCapture(0);
dst_img=cvQueryFrame(capture);
tmp = cvCreateImage(cvGetSize(dst_img), IPL_DEPTH_8U, 3);
src_img1 = cvCreateImage(cvGetSize(dst_img), IPL_DEPTH_8U, 1);//グレースケールへ変換
src_img2 = cvCreateImage(cvGetSize(dst_img), IPL_DEPTH_8U, 1);//グレースケールへ変換
// (1)必要な構造体の確保
eig_img = cvCreateImage (cvGetSize (src_img1), IPL_DEPTH_32F, 1);
temp_img = cvCreateImage (cvGetSize (src_img1), IPL_DEPTH_32F, 1);
corners1 = (CvPoint2D32f *) cvAlloc (corner_count * sizeof (CvPoint2D32f));
corners2 = (CvPoint2D32f *) cvAlloc (corner_count * sizeof (CvPoint2D32f));
prev_pyramid = cvCreateImage (cvSize (src_img1->width + 8, src_img1->height / 3), IPL_DEPTH_8U, 1);
curr_pyramid = cvCreateImage (cvSize (src_img1->width + 8, src_img1->height / 3), IPL_DEPTH_8U, 1);
status = (char *) cvAlloc (corner_count);
criteria = cvTermCriteria (CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 64, 0.01);
cvNamedWindow ("Image");
while(1){
dst_img=cvQueryFrame(capture);
cvCopy(dst_img,tmp);
cvCvtColor(dst_img,src_img1,CV_BGR2GRAY);
// (2)疎な特徴点を検出
cvGoodFeaturesToTrack (src_img1, eig_img, temp_img, corners1, &corner_count, 0.001, 5, NULL);
printf("found:%d\n",corner_count);
//どこを特徴点にしたのかわかりにくにので独自に追加した。
//コーナーの描画 青色
//cvFindCornerSubPix (src_img1, corners1, corner_count, cvSize (3, 3), cvSize (-1, -1), cvTermCriteria (CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, 0.03));
for (i = 0; i < corner_count; i++)
cvCircle (dst_img, cvPointFrom32f (corners1[i]), 3, CV_RGB (0, 0, 255), 2);
// (3)オプティカルフローを計算
cvCalcOpticalFlowPyrLK (src_img1, src_img2, prev_pyramid, curr_pyramid, corners1, corners2, corner_count, cvSize (10, 10), 4, status, NULL, criteria, 0);
// (4)計算されたフローを描画
for (i = 0; i < corner_count; i++) {
if (status[i])
cvLine (dst_img, cvPointFrom32f (corners1[i]), cvPointFrom32f (corners2[i]), CV_RGB (255, 0, 0), 1, CV_AA, 0);
}
cvShowImage ("Image", dst_img);
cvCvtColor(tmp,src_img2,CV_BGR2GRAY);
//cvShowImage ("Image", src_img1);
int key=cvWaitKey(100);
if(key>=0)break;
}
cvDestroyWindow ("Image");
cvReleaseImage (&src_img1);
cvReleaseImage (&src_img2);
//cvReleaseImage (&dst_img);
cvReleaseImage (&eig_img);
cvReleaseImage (&temp_img);
cvReleaseImage (&prev_pyramid);
cvReleaseImage (&curr_pyramid);
cvReleaseImage (&tmp);
cvReleaseCapture(&capture); //終了後に固まるのはこれがないことが多い
return 0;
}
最終更新:2010年01月26日 14:15