이번 포스팅은 OpenCV에서 Meanshift를 이용한 Object Detection에 대해 알아보겠습니다.
포스팅 관련 내용은 아래에서 출처를 얻어 사용하였습니다.
https://docs.opencv.org/4.5.2/d7/d00/tutorial_meanshift.html
GOAL
- 물체를 추적하는 Meanshift 알고리즘에 대해 공부할 것입니다.
Meanshift
- Meanshift는 말 그대로 Mean (평균) Shift (이동) 알고리즘입니다. Meanshift는 매우 직관적으로 이해할 수 있었는데 아래 그림처럼 어떤 데이터 포인트 셋이 있을 때 원 모양의 윈도를 그리고 가장 많은 데이터를 가지고 있는 원의 영역으로 이동합니다.
- 그림을 보시면 초기 윈도우 창은 C1이며 중심은 C1_o입니다. C1 안에서 포인트들의 중심은 C1_r입니다.
이제 C1의 무게 중심을 C1_r로 이동하고 C1을 다시 그립니다. 그래서 다시 C1_r이 중심이 된 C1이 그려지고 다시 그려진 C1 안에서의 포인트들의 중심점을 구하여 C1을 옮기는 과정을 반복하게 된다면 최종적으로 원의 중심점과 포인트들의 중심이 같을 때, 즉 윈도우가 최대 픽셀 분포를 가지게 되면 반복을 종료합니다.
- 이것은 위의 원으로 예시를 들었던 중심 이동을 실제 그림에서 일어나는 것을 보여줍니다.
통상 Histogram Backprojection 된 이미지와 초기 대상 위치를 구하고, 객체가 이동한다면 움직임이 히스토그램에 반영됩니다. 결국 Meanshift 알고리즘으로 최대 데이터 셋 분포를 가지는 곳으로 윈도우를 이동시키는 것입니다.
Using Meanshift With OpenCV
- 이제 OpenCV에서 Meanshift를 어떻게 사용하는지 알아봅시다.
OpenCV에서는 cv2.meanShift() 함수를 제공합니다.
- retval, window = cv2.meanShift(problmage, window, criteria)
입력 매개변수
- problmage : 관심 객체에 대한 히스토그램 역투영 영상
- window : 초기 검색 영역 윈도우 & 결과 영역 반환, 튜플
- criteria : 알고리즘 종료 기준, 튜플
- 출력
retval : 알고리즘 내부 반복 횟수
- [코드 출처]를 참고하여 코딩하였습니다.
- 결과
- Meanshift로 추적하면 물체의 상태에 상관없이 일정한 영역으로 추적합니다. 그래서 추적이 원활하게 되지 않을 때도 있습니다.
- 위 결과를 보면 사람과 사람 간의 구분을 못하는 것을 볼 수 있었고 창의 크기가 일정하게 유지되면서 추적하는 것을 볼 수 있습니다. 즉, 객체의 크기를 가늠하지 못하는 것입니다!
이번 포스팅은 Meanshift에 대해 알아보았고 다음 포스팅은 Camshift로 찾아오겠습니다
혹시 질문이나 틀린 점이 있으면 댓글로 알려주세요!
감사합니다:)
'영상처리' 카테고리의 다른 글
Python - OpenCV (17) : Camshift (0) | 2021.08.10 |
---|---|
Python - OpenCV (15) : Face Detection (0) | 2021.08.03 |
Python - OpenCV (14) : Image Pyramid (0) | 2021.07.26 |
Python - OpenCV (13) : SVM(Support Vector Machines) (0) | 2021.07.20 |
Python - OpenCV (12) : Segmentation with Watershed (0) | 2021.07.19 |