動画シリーズ コーナーの検出

静止画のサンプルを動画に変更する過程を(数値)のコメントで解説しています。
エイゲンヴァリュ

ハリス

以下のページの下側(最後)の例を使ってビデオ方式で処理できるように変換する
コーナー検出のサンプル
コーナーの検出 cvGoodFeaturesToTrack, cvFindCornerSubPix」
サンプルから動画への変換は「while句がある動画」を参考にすること。
メモリーリークの対応は、「ヒープ領域に作られるmalloc的な関数の使用上の注意」を参考にすること。

ソースコードはあえて整形していない。
変更したところは以下のコメントを書いている。
//(add.数値)  純粋に追加だけ
//(change.数値) 変更
//(move.数値)  移動
名前:
コメント:
「今日の訪問数: -
「昨日の訪問数: -
「今までの訪問数: -

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

最終更新:2010年01月26日 15:42
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。