금일은 OpenCV에서 제공하는 Tracker Class 에 대해 알아본다.
OpenCV 트래커 ( Tracker )
- OpenCV 3.0 버전부터 트래커 클래스 제공
- 트래커 클래스는 OpenCV extra modules 에서 지원하므로 opencv-contrib-python 패키지를 설치해야 함
- OpenCV 4.1 기준으로 8가지 트래킹 알고리즘 지원
이 전 강의에서는 이전 프레임의 객체가 다음 프레임에 어떻게 어디로 이동했는지를 보겠다 또는
어떤 점이 어디로 이동했다라는 정보를 추출할 수 있었는데 이런 알고리즘은 추적을 위한
기본적인 알고리즘으로 이용될 것이다.
그 외로 조금 더 고차원적인 추적 알고리즘을 클래스형태로 구현해서 제공하는 것이 있다.
이번 시간에 사용할 트래커 클래스를 이용하기 위해서는
패키지를 새로 업데이트 해야한다.
- pip uninstall opencv-python
- pip install opencv-contrib-python==4.1.0.25
위와같이 pip list 커맨드를 날려보면 현재 설치되어있는 리스트가 나오게되는데
이중 opencv-python을 삭제하고 다른 패키지 버젼으로 다운받아줘야 한다.
이렇게 pip install을 진행해주면 패키지 업데이트가 완료된다.
그리고 위에 나온 상속되어있는 클래스들을 실제로 동작시켜보면서 어떤식으로 동작하는지를 보자.
일단 클래스 사용 방법에 대해 알아보자
처음에는 Tracker Object 함수를 호출하여 어떤 추적방법을 사용할 것인지 설정해주고
Tracker가 추적할 객체의 boundingBox 를 지정해준다.
그리고 지속적으로 매 프레임을 이미지로 입력시켜주어 추적을 업데이트해준다.
그러면 객체의 위치를 boundingBox로 반환해준다.
그럼 실제 소스코드를 보자
여기서 중요한 부분은
코드를 자세히보면 ROI값을 int로 캐스팅해주는 것을 볼 수 있다.
update 함수를 사용하게되면 ROI박스를 float 형태로 리턴해주기 때문에 int형태로 캐스팅해서
사용해주어야 한다.
KCF라는 방법이 OpenCV에서 제공하는 알고리즘 중
그나마 빠르게 동작하는 알고리즘의 하나이다.
하지만 실제로 동작시켜보면 빠르다고 느껴지지는 않게 동작하는 모습을 볼 수있다.
그리고 두번째 영상의 객체를 추적해본다.
위 영상을 자세히보면 레이싱 중에 촬영된 영상인데 레이싱을 하는 사람 중 한명을 ROI로 지정해주고 실행해보면
중간까지는 추적을 잘하다가 중간에 배경과 객체의 경계가 모호해질때는 제대로 추적하지 못하는 모습을 보이게된다.
이렇게 객체를 한번 놓치게되면 계속해서 놓치는 모습을 볼 수 있다. ( KCF 방법 )
하지만 MOSSE , CSRT의 방법을 사용하게되면 속도는 조금 느려지기는 하지만 추적에 대해서는 더 효과적으로
사용할 수 있는 것을 결과영상으로 알게 되었다.
그래서 일반적인 영상에서는 추적이 가장 빠르게 동작되는 KCF방법을 사용하는 것이 좋지만
정확성을 높이기 위해서는 MOSSE나 CSRT 방법을 사용하는 것이 좋을 것 같다.
대부분의 Tracker들은 가려짐이 있으면 제대로 동작을하지 못한다.
영어로는 occlusion 한글로는 폐색, 가려짐이라고 하는데
그럴때에는 또다른 방법 예를들어 내가 추적하고있던 객체의 모양을 다시한번 전체 영상을 스캔해서
찾아내 다시 추적을 시작하는 방향으로 프로그램을 보완해야한다.
'Program > OPEN_CV' 카테고리의 다른 글
OPENCV 왜곡보정 (0) | 2024.10.29 |
---|---|
[Open CV] 딥러닝활용 _ Mask-RCNN 영역 분할 (0) | 2022.07.30 |
[Open CV] 객체추척과 모션벡터 _ 밀집 옵티컬플로우 (0) | 2022.07.03 |
[Open CV] 객체추척과 모션벡터 _ 카나데옵티컬플로우 (0) | 2022.07.02 |
[Open CV] 객체추척과 모션벡터 _ 캠시프트 알고리즘 (0) | 2022.06.30 |