728x90
반응형



OpenCV 객체추적 프로그램을 만들려면 일단 MeanShift 와 CamShift 개념을 알아야 한다. 사실 객체추적 혹은 영상추적 프로그램은 이미 OpenCV sample source에 나와있다. 2007년에 이 샘플코드를 어떻게 응용하고 다른 기술들을 접목하여 새로운 프로그램을 생성하는데 의의가 있다고 생각한다.


영상에서 객체를 추적하는 프로그램을 개발하기 위해서 반드시 알아야 하는 개념인 MeanShift와 CamShift에 대해서 알아보도록 한다.



1. Mean-Shift Algorithm


Mean-Shift 알고리즘은 데이터집합에서 특짐정, 코너, 색상정보와 같은 밀도 분포를 기반으로 ROI 객체를 추적해나가는 알고리즘이다. 이는 데이터 분포에서 peak 또는 무게중심을 찾는 방법으로써 객체를 추적 할 수 있다.


초기의 검색 영역의 포인트를 지정하고 크기를 지정하면 반복되는 색 분할 계산에 의해 색상클러스터가 발생되고, 초기 지정한 색 영역에 기반하여 경계를 결정하여 관심 물체를 추적해 나갈 수 있는 알고리즘이다.


그러나 앞서 설명했듯이 주변의 지역적인(local) 상황만 판단하여 진행방향을 결정하며 추적하기 때문에

탐색 반경을 설정해 주는 것이 필요하다. 탐색반경도 너무 크게 잡거나 작게 잡으면 인공지능에서 배웠던 local minimum에 빠지기 쉽다.


그래서 OpenCV Sample Code에 나와있는 것처럼 초기에 검색 영역을 잡아주는 과정이 반드시 필요하다.

(Sample Code는 Camshift 예제임)


샘플코드를 테스트 해봤을때 초기에 검색할 영역을 마우스 이벤트를 발생시켜 잡아주도록 했는데(직접설정..) 나중에는 이를 변형하여 마우스 이벤트가 아니라 자동으로 원하는 객체를 추적 할 수 있도록 객체를 잡아주는 과정이 필요 할 것 같다. (물론 배경이 깔끔하고, 정적이며, 움직이는 물체가 적어야 한다는 한계점이 있지만)


이제 정리해보자면 한마디로, Mean-Shift Algorithm은 특정 데이터들의 중심(Mean)으로 이동(Shift)하는 알고리즘이다.


추적하고자 하는 대상 물체에 대한 색상 히스토그램과 입력영상의 히스토그램을 비교해서 가장 유사한 히스토그램을 갖는 윈도우 영역을 찾는 과정을 거치게 된다. 또한, 추적하려는 환경이 제한된 곳에서 유용하게 쓰일 수 있다. 




2. CAMShift Algorithm


CAMShift(Continuously Adaptive Mean Shift Algorithm)은  MeanShift 알고리즘을 이용하여 객체를 추적하는 환경에서 사용하기 위해 개선한 알고리즘이다. 탐색 윈도우의 크기를 스스로 조정하는 기법을 사용하여 Mean-Shift의 단점을 보완 할 수 있다.


객체를 고속으로 추적하는데 있어 사용되고,  CAMshift의 경우 객체의 크기, 회전 변화를 추적할 수 있으며

특히나 사람 얼굴을 추적하는데 있어서 뛰어남을 보인다고 한다. 그러나 물체에 여러 색이 섞여있거나 배경과 구분되기 어려운 색상의 객체가 포함된 영상일 경우 meanshift보다 성능이 떨어질 수 있다.


OpenCV 샘플 소스는 CAMShift 를 구현해 놓은 것이고, 객체가 사라졌을 경우 더 이상 추적할 수 없게 된다.



내용 출처 : http://techlog.gurucat.net/146 / http://darkpgmr.tistory.com/111

소스 출처 : OpenCV Sample Source










OpenCV를 이용하여 객체 추적 프로그램을 개발하는데 있어서 유용한 논문이 하나 있는데 읽어보면 좋을 것 같다.


ADAM, Amit; RIVLIN, Ehud; SHIMSHONI, Ilan. Robust fragments-based tracking using the integral histogram. In: 2006 IEEE Computer Society Conference on Computer Vision and Pattern Recognition (CVPR'06). IEEE, 2006. p. 798-805.







사실 Fragtrack 이라고 공개되어있는 코드가 있는데, 하도 버전도 오래되고 lib도 안맞아서 돌려보니 알 수 없는(? 해결하기 귀찮은) cv 에러가 떠서그냥 OpenCV 샘플코드를 돌려봤다.


위 논문의 출처 또는 소스코드는 아래 사이트에 있다.


http://www.cs.technion.ac.il/~amita/fragtrack/fragtrack.htm


위 사이트에 나와있는 몇가지 동영상을 소개하자면 아래와 같은데, 꽤나 객체 추적이 잘 된다.














그리고 NTSC 영상을 PC에서 처리할 수 있도록 디지타이즈해서 USB 포트로 전송하는 myVision USB를 이용하면 OpenCV의 알고리즘은 실시간 영상에서 손쉽게 적용 할 수 있다고 하는데 아직 사용해 보진 않았다. myVision USB 디바이스를 제대로 설치한다면 사용할 수 있다고 한다. 


참고자료 : https://www.youtube.com/watch?v=-NaXMDOquY8

myVision USB 설치 방법 : http://www.withrobot.com/myvision-usb-myvision-usb-dx-window8-%EC%84%A4%EC%B9%98-%EB%B0%A9%EB%B2%95/


그런데 프로젝트를 하는데 있어서 이미 만들어져 있는 프로그램에 추가를 하는 것이므로 (이미 영상을 OpenCV에 잘 받아오고 있으므로)

굳이 이거까진 할 필요 없을 듯 하지만 알면 좋을 것 같아서 써두어야지






728x90
반응형