코코야이야기
[c++] OpenCV 원검출 본문
소스코드
//영상에서 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 |