#include <opencv\cv.h>
#include <opencv\highgui.h>
#include <math.h>
void main()
{
// Create other image plane
IplImage* image = cvLoadImage("circle.jpg",1);
int i, j, k, wi, hi, rwsize;
wi = image->width;
hi = image->height;
rwsize = image->widthStep;
IplImage* edgeimage = cvCreateImage(cvSize( wi, hi ), IPL_DEPTH_8U, 3);
IplImage* tempimage = cvCreateImage(cvSize( wi, hi ), IPL_DEPTH_8U, 3);
for(i=0; i<hi; ++i)
for(j=0; j<wi; ++j)
for(k=0; k<3; ++k)
edgeimage->imageData[i*rwsize+j*3+k] = tempimage->imageData[i*rwsize+j*3+k] = 0;
// Graysclae
for(i=0; i<hi; ++i)
for(j=0; j<wi; ++j)
image->imageData[i*rwsize+j*3+2] = (unsigned char)(((int)image->imageData[i*rwsize+j*3+2]+(int)image->imageData[i*rwsize+j*3+1]+(int)image->imageData[i*rwsize+j*3+0])/3);
// cvShowImage( "image",image );
////라플라시안 edge
//int laplacianMask[3][3] = {-1,-1,-1,-1,8,-1,-1,-1,-1};
//int THD = 0;
//int edge;
//for(int i=1;i<hi-1;i++){
// for(int j=1;j<wi-1;j++){
// edge = 0;
// for(int x=-1;x<2;x++){
// for(int y=-1;y<2;y++){
// edge += image->imageData[(i+x)*rwsize+(j+y)*3]*laplacianMask[x+1][y+1];
// }
// }
// //edge 값이 threshold 보다 크면 edgeimage에 그려줌
// if(edge > THD)
// edgeimage->imageData[i*rwsize+j*3+0] =edgeimage->imageData[i*rwsize+j*3+1] =edgeimage->imageData[i*rwsize+j*3+2] = 255;
// }
//}
cvLaplace(image, edgeimage, 3);
// cvShowImage( "edge", edgeimage );
// Draw Circle to Hough Plane
double r = 135;
double angle = 0;
int count = 0;
for(i=1; i<hi-1; ++i)
for(j=1; j<wi-1; ++j)
if (edgeimage->imageData[i*rwsize+j*3] != 0) //흰색이라면
{
angle = 0; //각도 초기화
while(angle<360) //한바퀴
{
int x = r * cos((double)angle) + i; //여기서 i, j는 시작지점을 말한다.
int y = r * sin((double)angle) + j;
if (x>=0 && x<hi && y>=0 && y<wi) //그림 크기 안에서
tempimage->imageData[x*rwsize+y*3+0] = tempimage->imageData[x*rwsize+y*3+1] = tempimage->imageData[x*rwsize+y*3+2] = 255;
angle = angle + 0.1;
}
for(int ti=0; ti<hi; ++ti)
for(int tj=0; tj<wi; ++tj)
{
if(tempimage->imageData[ti*rwsize+tj*3] != 0) //검은색이 아닌 어떤 픽셀이 존재한다면
for(int tk=0; tk<3; ++tk)
image->imageData[ti*rwsize+tj*3+tk]++; //grayscale된 이미지의 r,g,b값을 각각 증가시킴
tempimage->imageData[ti*rwsize+tj*3] = 0; //r,g,b에서 b값만 0이되고 나머지는 255이므로 노란색이 나옴
//위의 if문에서 중복하여 읽지 않도록 0으로 초기화한다
}
}
// cvShowImage( "exchangedimage", image );
//Find Maximum Point
int mx = 0;
int centeri, centerj;
centeri = centerj = 0;
for(i=1; i<hi-1; ++i)
for(j=1; j<wi-1; ++j)
{
if (mx < (image->imageData[i*rwsize+j*3+2]+image->imageData[i*rwsize+j*3+1]+image->imageData[i*rwsize+j*3+0])/3)
{
mx = (image->imageData[i*rwsize+j*3+2]+image->imageData[i*rwsize+j*3+1]+image->imageData[i*rwsize+j*3+0])/3;
centeri = i;
centerj = j;
}
}
// Draw Result Circle
printf("%d",mx);
cvCircle(image, cvPoint(centerj,centeri), (int)r, cvScalar(0,0,255));
cvCircle(image, cvPoint(centerj,centeri), (int)1, cvScalar(0,0,255));
cvShowImage("finalimage", image);
cvWaitKey(0);
}
|