관리 메뉴

코코야이야기

[c++] OpenCV 원검출 본문

프로그래밍/OpenCV

[c++] OpenCV 원검출

코코야 2015. 9. 24. 14:00
반응형

소스코드

//영상에서 cvHoughCircle 함수로 원검출

#include "cv.h"
#include "highgui.h"

int main()
{
 IplImage *srcImage;
 if((srcImage = cvLoadImage("circle.jpg",CV_LOAD_IMAGE_GRAYSCALE)) ==NULL)
  return -1;
 IplImage* dstImage = cvCreateImage(cvGetSize(srcImage),IPL_DEPTH_8U,3);
 
 CvMemStorage* storage = cvCreateMemStorage(0);
 int k;
 double dp =1;
 double min_dist=100;
 double cannyThreshold=100;
 double accThreshold=50;
 CvSeq* seqCircle = cvHoughCircles(srcImage,storage,CV_HOUGH_GRADIENT,dp,min_dist,cannyThreshold,accThreshold);
 //cvHoughCircles(영상,검출된 원의 메모리 공간 - 행렬형태저장,method=CV_HOUGH_GRADIENT,원의 중심점검출(dp=1이면 입력영상과 같은크기 dp=2이면 입력영상의 반),검출된 원의 중심사이의 최소거리,
 //     param1는 cvCanny함수의 임계값, param2,원의 최소반지름, 원의 최대반지름)

 printf("seqLines->total = %d\n",seqCircle->total);
 cvCvtColor(srcImage,dstImage,CV_GRAY2BGR);

 for(k=0;k<seqCircle->total;k++)
 {
  float* circle;
  int cx,cy,radius;

  circle = (float*)cvGetSeqElem(seqCircle,k);

  cx=cvRound(circle[0]);
  cy = cvRound(circle[1]);
  radius = cvRound(circle[2]);

  printf("circle[%4d]=(cx,cy,radius)=(%d,%d, %d)\n",k,cx,cy,radius);

  cvCircle(dstImage,cvPoint(cx,cy),radius,CV_RGB(255,0,0),3,8,0);
 }

 cvNamedWindow("dstImage",CV_WINDOW_AUTOSIZE);
 cvShowImage("dstImage",dstImage);
 
 IplImage *edgeImage = cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_8U,1);
 cvCanny(srcImage,edgeImage,cannyThreshold/2,cannyThreshold,3);
 cvNamedWindow("edgeImage", CV_WINDOW_AUTOSIZE);
 cvShowImage("edgeImage",edgeImage); 
 cvWaitKey(0);
 cvDestroyAllWindows();
 cvReleaseImage(&srcImage);
 cvReleaseImage(&dstImage);
 cvReleaseMemStorage(&storage);
 cvReleaseImage(&edgeImage);
 return 0;
}

 

 

출력영상

 

반응형

'프로그래밍 > OpenCV' 카테고리의 다른 글

[c++] OpenCV 템플릿매칭1  (0) 2015.09.25
[c++] OpenCV 특징점검출  (0) 2015.09.24
[c++] OpenCV 직선검출  (0) 2015.09.23
[c++] OpenCV 영상엣지검출  (0) 2015.09.23
[c++] OpenCV 트랙바추가  (0) 2015.09.22
Comments