#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; }