動画シリーズ 円の検出ハフ変換

goinger的日記さんを参考に作ってみました。

サンプルから動画への変換は「while句がある動画」を参考にすること。
メモリーリークの対応は、「ヒープ領域に作られるmalloc的な関数の使用上の注意」を参考にすること。

「今日の訪問数: -
「昨日の訪問数: -
「今までの訪問数: -
名前:
コメント:

main.cpp---------------------------------------------------------
 #include <stdio.h>
#include <cv.h>
#include <highgui.h>
 
int
main (int argc, char *argv[])
{
  int i,ii;
  float *p,*pp;
  IplImage *src_img = 0, *gray_img = 0;
  CvMemStorage *storage;
  CvSeq *circles ;
  CvCapture *capture = NULL;
 
 
  /* この設定は,利用するカメラに依存する */
  capture = cvCreateCameraCapture (0);
 
  cvNamedWindow ("circles", CV_WINDOW_AUTOSIZE);
  cvNamedWindow ("平滑化", CV_WINDOW_AUTOSIZE);
  storage = cvCreateMemStorage (0);
  src_img = cvQueryFrame (capture);
  gray_img = cvCreateImage (cvGetSize (src_img), IPL_DEPTH_8U, 1);
  while (1)
    {
      src_img = cvQueryFrame (capture);
      // グレイスケールに変換
      cvCvtColor (src_img, gray_img, CV_BGR2GRAY);
      // (2)ハフ変換のための前処理(画像の平滑化を行なわないと誤検出が発生しやすい)
      cvSmooth (gray_img, gray_img, CV_GAUSSIAN, 9, 9);
      cvShowImage ("平滑化", gray_img);
 
      // (3)ハフ変換による円の検出と検出した円の描画
 
      circles =
	cvHoughCircles (gray_img, storage, CV_HOUGH_GRADIENT, 1, 100, 20, 50,
			10, MAX (gray_img->width, gray_img->height));
 
 
      for (i = 0; i < circles->total; i++)
	{
	  p = (float *) cvGetSeqElem (circles, i);
			  cvCircle (src_img, cvPoint (cvRound (p[0]), cvRound (p[1])), 3, CV_RGB (0, 255, 0), -1, 8, 0);//中心点
			  cvCircle (src_img, cvPoint (cvRound (p[0]), cvRound (p[1])), cvRound (p[2]), CV_RGB (255, 0, 0), 3, 8, 0);//円をトレース
      			printf ("円らしきもの%dつ発見 中心(%d,%d) 半径%d\r", circles->total,cvRound(p[0]),cvRound(p[1]),cvRound(p[2]));
	  }
      // (4)検出結果表示用のウィンドウを確保し表示する
 
      cvShowImage ("circles", src_img);
      int key = cvWaitKey (1);
      if (key >= 0)
	{
	  break;
	}
    }
  cvReleaseCapture (&capture);
  cvReleaseImage (&src_img);
  cvReleaseImage (&gray_img);
  cvReleaseMemStorage (&storage);
  cvDestroyWindow ("平滑化");
  cvDestroyWindow ("circles");
  return 0;
}
最終更新:2010年01月27日 09:54
ツールボックス

下から選んでください:

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