티스토리 뷰

OpenCV

[OpenCV] Threshold 값의 변화에 따른 edge extraction

생각많은 소심남 2012. 8. 14. 14:36

배경 제거 방식을 통해서 손만 검출할 수 있으니까 이제 할려고 하는 일이 손의 edge를 따는 일입니다. 그중 나온지는 오래되었지만 가장 대중적이고 많이 쓰이는 방식인 Canny edge Detection을 공부하고 있습니다.

- 원 본 -


Canny Edge Detector는 기본적으로 그레이스케일화 된 이미지만을 처리할 수 있습니다. 물론 최근 버전에서는 Color에서도 Edge Detection이 되게 하는 방법도 제시되고 있는데 아직까지는 Color Image를 그레이스케일로 convert 시킨후, 혹은 IPL_DEPTH_8U를 통해서 한개의 채널로만 이미지를 형성해서 edge를 감지합니다. 위의 원본도 그런 형식이지요.


cvCanny의 함수는 다음과 같이 사용됩니다.

cvCanny(

const CvArr* image,                          ---- 원본의 이미지

CvArr* edges,                                  ---- 엣지를 추출한 결과물

double threshold1,                            ---- low Threshold 

double threshold2,                            ---- high Threshold

int aperture_size                               ---- 필터의 크기  

);


여기서 밑의 결과물이 나타내는 것은 low 임계값과 high 임계값을 변화시켰을 때 엣지를 얼마나 잘 탐지할 수 있나를 확인해보고자 하는 예제였습니다. 원리는 필터가 이동하면 픽셀의 그레디언트가 high 값보다 크면 엣지, low보다 작으면 엣지가 아니라고 인식합니다. 만약 값이 high와 low 사이에 있으면 그 주위에 엣지가 있는지 확인한 후에 있으면 엣지라고 인식하는 거지요.



- High Threshold 값을 수정했을 때 변화 -


- low Threshold 값 수정했을 때 변화 -


변화가 느껴지시나요? 결론적으로 이 high값과 low 값을 적절하게 수정한다면 딱 사람의 테두리만을 뽑아낼 수 있을겁니다. 대신 high값을 무지막지 하게 크면 진짜 왠만해서는 엣지로 안 뽑히겠지요. 

 이걸 지금하는 이유는 다음을 테스트하려는 목적이었습니다.


사람의 손도 폐곡선을 이루는 이상 여러개의 엣지들이 나타날겁니다. 이때 high값과 low값을 적절히 수정한다면 딱 finger Tip에 맞는 이미지가 나오지 않을까요? 어차피 fingerTip 또한 손을 구성하는 모양중에서도 하나의 엣지일테니까요. 물론 여기다가 여기다가 기존의 손이 나오는 Frame을 Mask만 잘한다면 손이미지만 빼는 건 쉬운 일이 될거라고 생각합니다. 제가 잘 몰라서 하는 이야기 일수도 있습니다 ;;


https://dl.dropbox.com/u/96808368/OpenCV/EdgeDetect.cpp

댓글