OpenCV를 이용한 객체탐지

Tetrapod·2024년 5월 27일
post-thumbnail
  • Yolo를 이용한 객체탐지는 일반적으로 회전된 객체에 대하여 탐지가 어렵다.
  • OpenCV의 패턴 매칭을 이용한 회전된 단일 객체탐지를 구현하고자 한다.
  • OCR 엔진을 추가하여 회전된 객체에 대하여 OCR 기능을 넣어보고자 한다.

OpenCV의 Perspective Transform

  • 아래 그림과 같이 촬영 시점에 의해 객체가 회전되거나 납작해져도 OpenCV 기능을 통해 이미지를 변환할 수 있다.


Step. 1

  • 탐지하고 싶은 객체 이미지 한 장을 4-dot 폴리곤으로 bound-boxing 하여 라벨링 한다.
  • 4-dot polygon으로부터 객체의 width, height을 구한다.
  • w,h로 부터 다시 직사각형 모양의 4-dot box를 생성한다.
  • 4-dot box를 사전 라벨이라고 하자.
  • 4-dot polygon과 사전 라벨을 cv2.getPerspectiveTransform을 이용하여 변환행렬 mm을 얻는다.
  • 변환행렬 mm을 이용하여 라벨링했던 객체 이미지를 w,h 와 cv2.warpPerspective를 이용하여 객체 이미지를 정방향 이미지로 변환한다.
  • 이를 사전 이미지라고 하자.

Step. 2

  • OpenCV의 ORB를 이용하여 사전 이미지와 실제 이미지를 특징점 검출한다.
  • 두 특징점들을 비슷한 특징점들끼리 매칭할 수 있는데 부정확한 쌍도 매칭된다.
  • 매칭된 쌍을 RANSAC 알고리즘을 이용하여 유효한 쌍을 필터링한다.
  • 이 과정에서 변환행렬 MM을 얻는다.


Step. 3

  • 사전 라벨을 변환행렬 MM을 이용하여 촬영된 이미지에 4-dot 폴리곤을 그릴 수 있다.
  • 변환행렬 MM의 역행렬을 M1M^{-1}이라 하자.
  • 촬영 이미지에 변환행렬 M1M^{-1}을 적용하여 정방향 촬영 이미지를 얻을 수 있다.


Step. 4

  • 사전 라벨에 글자 위치 폴리곤이 포함되어 있다면 정방향 촬영 이미지를 해당 부분을 Crop한다.
  • Crop된 글자 이미지를 OCR엔진에 넣을 수 있고 바코드 이미지 였다면 바코드 리딩을 할 수 있다.


Example

  • 아래 그림과 같이 회전된 객체안 글자가 포함되어도 객체 정방향 복원을 통해 글자를 읽을 수 있다.
  • 어떤 객체인지는 사전 이미지 매칭을 통해 판별 가능하다.
  • 대신 사전 이미지가 많아질 수록 판독 시간은 O(n)으로 늘어남.
  • 이미지 매칭 기반이기 때문에 일부 가려져도 탐지한다.

장점

  • 객체를 딥러닝 학습과정 없이 쉽게 추가할 수 있다.
  • 공장에서 나오는 제품처럼 거의 똑같은 객체에 대하여 위 방식이 적합하다고 생각한다.

단점

  • 객체가 완전히 똑같지 않으면 객체탐지를 잘 못할 가능성이 크다.
  • 이미지 패턴 매칭 특성상 단일 객체탐지만 가능하다.

Reference

0개의 댓글