When will you grow up?

16.Canny연산자로 영상 외곽선 검출 본문

02. Study/Computer Vision(openframworks&opencv)

16.Canny연산자로 영상 외곽선 검출

미카이 2016. 10. 28. 19:24

앞서 강의에서는 Sobel를 이용하여 에지를 검출했었습니다.


이번에는 Canny알고리즘이 적용된 cv::Canny함수를 호출하여 외곽선을 검출


Canny Edge Detection 은 John F. Canny에 의해 개발된 알고리즘 입니다.

윤곽을 가장 잘 찾아내면서도 원래 영상의 관련된 에지들을 제거할 수 있는 방법


1.검출한 에지는 필요 이상으로 뚜껍기 때문에 객체를 훨씬 더 식별 하기가 힘들다.

2.충분히 낮은 경계 값과 동시에 너무나 많은 무의미한 에지를 포함하지 않도록 충분히 높은 경계 값을 찾기란 힘들기 때문에 이러한 이유로 캐니 알고리즘으로 푼다.


Canny( detected_edges, detected_edges, lowThreshold, lowThreshold*ratio, kernel_size ); //원본이미지,출력될 이미지,낮은 경계값,높은경계값,커널사이즈)


결과 영상입니다

원본/경계값 0

원본/경계값 30

원본/경계값 50

원본/경계값 100



//전역 변수 부분

int lowThreshold; int const max_lowThreshold = 100; int ratio_1 = 3; int kernel_size = 3; const char* window_name = "Edge Map";


핵심 함수 부분 입니다.



static void CannyThreshold(int, void*)
{
	blur(src_gray, detected_edges, Size(3, 3));
	Canny(detected_edges, detected_edges, lowThreshold, lowThreshold*ratio_1, kernel_size);
	dst = Scalar::all(0);
	src.copyTo(dst, detected_edges);
	imshow(window_name, dst);
}



순서는

3/3 크기로 블러를 적용후 Canny함수를 호출한다


dst이미지를 픽셀 데이터 값을 0으로 셋팅후 엣지된 데이터를 dst에 넣고 출력


lowThreshold값 조정으로 경계값을 조절하며 확인.



Main 부분입니다.



src = imread("223.JPG",1);//이미지 로드
	dst.create(src.size(),src.type());//동일한 유형의 src크기의 행렬생성
	cvtColor(src, src_gray, COLOR_BGR2GRAY);//grayscale로 변경
	namedWindow(window_name, WINDOW_AUTOSIZE);//윈도우 크기 및 이름 설정
	createTrackbar("Min Threshold:", window_name, &lowThreshold, max_lowThreshold, CannyThreshold);//사용자가 0~100까지 임계값 입력할수있는 트랙바 만들기
	CannyThreshold(0, 0);//처음 임계값이 0 임을 보여주기 위한 함수 호출 나머지는 트랙바를 통하여 컨트롤


Comments