#include <cv.h>
#include <highgui.h>
int
main (int argc, char **argv)
{
CvCapture *capture;//(add.1)
int i, corner_count = 150;
IplImage *dst_img1, *dst_img2, *src_img_gray;
IplImage *eig_img, *temp_img;
CvPoint2D32f *corners;
capture = cvCreateCameraCapture(0); //(change.1)カメラを初期化 cvLoadImageはいらない
//if (argc != 2 || (dst_img1 = cvLoadImage (argv[1], CV_LOAD_IMAGE_ANYCOLOR | CV_LOAD_IMAGE_ANYDEPTH)) == 0)
// return -1;
dst_img1 = cvQueryFrame(capture); //(add.2)カメラから画像を取り込む。dst_img1をつかっているのでそのまま使う。
dst_img2 = cvCloneImage (dst_img1);
src_img_gray = cvCreateImage(cvGetSize(dst_img1), IPL_DEPTH_8U, 1);//(change.2)グレースケールへ変換
//src_img_gray = cvLoadImage (argv[1], CV_LOAD_IMAGE_GRAYSCALE);
eig_img = cvCreateImage (cvGetSize (src_img_gray), IPL_DEPTH_32F, 1);
temp_img = cvCreateImage (cvGetSize (src_img_gray), IPL_DEPTH_32F, 1);
corners = (CvPoint2D32f *) cvAlloc (corner_count * sizeof (CvPoint2D32f));
cvNamedWindow ("EigenVal", CV_WINDOW_AUTOSIZE);//(move.1)
cvNamedWindow ("Harris", CV_WINDOW_AUTOSIZE);//(move.2)
while(1){//(add.3)
dst_img1 = cvQueryFrame(capture);//(add.4)カメラから画像を取り込む
cvCopy(dst_img1, dst_img2);//(add.5)
cvCvtColor(dst_img1, src_img_gray, CV_BGR2GRAY);//(add.6)
// (1)cvCornerMinEigenValを利用したコーナー検出
cvGoodFeaturesToTrack (src_img_gray, eig_img, temp_img, corners, &corner_count, 0.1, 15);
cvFindCornerSubPix (src_img_gray, corners, corner_count,
cvSize (3, 3), cvSize (-1, -1), cvTermCriteria (CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, 0.03));
// (2)コーナーの描画
for (i = 0; i < corner_count; i++)
cvCircle (dst_img1, cvPointFrom32f (corners[i]), 3, CV_RGB (255, 0, 0), 2);
// (3)cvCornerHarrisを利用したコーナー検出
corner_count = 150;
cvGoodFeaturesToTrack (src_img_gray, eig_img, temp_img, corners, &corner_count, 0.1, 15, NULL, 3, 1, 0.01);
cvFindCornerSubPix (src_img_gray, corners, corner_count,
cvSize (3, 3), cvSize (-1, -1), cvTermCriteria (CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, 0.03));
// (4)コーナーの描画
for (i = 0; i < corner_count; i++)
cvCircle (dst_img2, cvPointFrom32f (corners[i]), 3, CV_RGB (0, 0, 255), 2);
// (5)画像の表示
cvShowImage ("EigenVal", dst_img1);
cvShowImage ("Harris", dst_img2);
int c=cvWaitKey(1000);//(change.3) 1秒待ってゆっくり処理させる
if(c>=0)break;
//cvWaitKey (0);
}//(add.7)
cvDestroyWindow ("EigenVal");
cvDestroyWindow ("Harris");
//cvReleaseImage (&dst_img1);(change.4) カメラ装置が確保した領域はドライバに任せる
cvReleaseImage (&dst_img2);
cvReleaseImage (&eig_img);
cvReleaseImage (&temp_img);
cvReleaseImage (&src_img_gray);
cvReleaseCapture(&capture);//終了後に固まるのはこれがないことが多い
return 0;
}