OpenCV Edge Detection

Programming/OpenCV 2013. 12. 26. 15:53 Posted by gaeddong2

#include <opencv/cv.h>

#include <opencv/highgui.h>

int main()

{

 

IplImage* img = cvLoadImage("lena.jpg",0);

cvNamedWindow( "example-input" );

cvNamedWindow( "example-output" );

 

// Show the original image

cvShowImage("example-input", img);

 

// Make sure image is divisible by 2

assert( img->width%2 == 0 && img->height%2 == 0);

 

// Create an image for the output

IplImage* out = cvCreateImage( cvSize(img->width/2,img->height/2), img->depth, img->nChannels );

 

// Reduce the image by 2

cvPyrDown( img, out );

 

// Perform canny edge detection

cvCanny( out, out, 10, 100, 3 );

 

// Show the processed image

cvShowImage("example-output", out);

 

cvWaitKey(0);

cvReleaseImage( &img );

cvReleaseImage( &out );

cvDestroyWindow( "example-input" );

cvDestroyWindow( "example-output" );

 

return 0;

}



assert()

프로그램을 수행하면서 반드시 강제해야 하는 조건이 있을 때 사용한다개발 도중 버그가 생길 수 있으니본 루틴을 수행하기 전에 몇 가지 조건들을 검사함으로써 실수를 빨리 발견할 수 있도록 해 준다.

 

위에서 assert( img->width%2 == 0 && img->height%2 == 0); 값들이 인 경우 강제적으로 조건에 걸리도록 해야 한다.

 

void cvPyrDown(const CvArr *src, CvArr *dst, int filter=CV_GAUSSIAN_5*5);

영상 src에 filter=CV_GAUSSIAN_5*5를 적용하여 필터링한 후에가로세로 각각을 1/2배 크기로 축소하여 결과를 dst에 저장한다.

 

반대로 cvPyrUp함수는 가로,세로 각각을 2배 크기로 확대하여 결과를 dst에 저장한다.

 

에지검출 >

에지는 영상의 물체와 물체 또는 물체와 배경사이의 테두리에서 발생한다.

Edge를 정의하면 Image의 강도가 급격하게 변하는 부분으로 본다.

 

극 값은 Maximum, Minimum 2군대를 찾을 수 있다이 두 가지를 합쳐서 Extrema라고 부른다이렇게 Extrema를 찾기 위해서는 Sobel Maqsk를 이용하여 컨볼루션 한다.

 

x축과 y축에 대해서 미분을 하면 각각 영상을 얻을 수 있다.

canny edge detector는 기본적으로 그레이스케일화 된 이미지만을 처리할 수 있다

void cvCanny(const CvArr * image, CvArr* edges, double threshold1, double threshold2, int aperture_size = 3);

 

1채널인 입력영상 image에서 에지를 검출하여 결과를 edges에 저장한다.

aperture_size * aperture_size 크기의 커널 필터를 사용하고히스테리시스 임계값에 사용되는 두 임계값 threshold1 < threshold2를 사용하여 에지를 연결한다.

 

(필터가 이동하면 픽셀의 그레이언트가 hight값보다 크면 엣지, low보다 작으면 엣지가 아니라고 인식한다만약 값이 hight와 low사이에 있으면 그 주위에 엣지가 있는지 확인한 후에 있으면 엣지라고 인식한다.)

 

high와 low값을 적절하게 수정해야 적절한 테두리를 뽑아낼 수 있다대신 high값을 무지막지 하게 크면 왠만해서는 엣지로 안 뽑힌다.