#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); 값들이 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값을 무지막지 하게 크면 왠만해서는 엣지로 안 뽑힌다.
'Programming > OpenCV' 카테고리의 다른 글
행렬 및 이미지 화면에 출력하기 위한 함수 정리 (0) | 2013.12.26 |
---|