DataScience
article thumbnail
728x90

 

Object detection 객체 감지는

모든 단일 프레임 및 프레임 후 프레임 입니다.


Object tracking 객체 추적은 프레임별 추적을 수행하지만 시간이 지남에 따라 객체가 있는 위치의 기록을 유지합니다.

 

가능한 애플리케이션은 특정 영역에 몇 명의 사람이 있는지 계산하거나 컨베이어 벨트를 통과하는 물체의 수를 확인하거나 고속도로에서 차량을 계산 등이 있습니다.

 

cv2를 import 해주고 

먼저 Highway.mp4 파일을 호출하고 마스크를 생성 해야 합니다.

 알고리즘의 "배경 비율" 매개변수를 반환한 다음 마스크를 생성하는 createBackgroundSubtractorMOG2 함수도 사용했습니다.

 

import cv2
from object_tracking.tracker import *

# Create tracker object
tracker = EuclideanDistTracker()

cap = cv2.VideoCapture("object_tracking/highway.mp4")

# Object detection from Stable camera
object_detector = cv2.createBackgroundSubtractorMOG2(history=100, varThreshold=40)

while True:
    ret, frame = cap.read()
    height, width, _ = frame.shape

    # Extract Region of interest
    roi = frame[340: 720,500: 800]

    # 1. Object Detection
    mask = object_detector.apply(roi)

이것은 첫 번째 결과입니다.

 

이미지에 많은 노이즈가 있어서 더 작은 요소를 모두 제거하여 개선하고 특정 영역보다 큰 개체에 주의를 집중해 보겠습니다.

     _, mask = cv2.threshold(mask, 254, 255, cv2.THRESH_BINARY)
    contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    for cnt in contours:
        # Calculate area and remove small elements
        area = cv2.contourArea(cnt)
        if area > 100:
        #Show image

OpenCV의 cv2.drawContours 함수로 윤곽선을 그리면 이 결과를 얻습니다. 이 함수를 사용할 필요가 없습니다. 첫 번째 결과의 디버그로 간주하세요.

 

전체 창을 분석하는 것은 중요하지 않습니다. 우리는 특정 지점을 통과하는 모든 차량을 세는 데만 관심이 있기 때문에 ROI 관심 영역을 정의하고 이 영역에만 마스크를 적용해야 합니다.

while True:
    ret, frame = cap.read()
    height, width, _ = frame.shape

    # Extract Region of interest
    roi = frame[340: 720,500: 800]

    # 1. Object Detection
    mask = object_detector.apply(roi)
    _, mask = cv2.threshold(mask, 254, 255, cv2.THRESH_BINARY)
    contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    detections = []
    for cnt in contours:
        # Calculate area and remove small elements
        area = cv2.contourArea(cnt)
        if area > 100:
            cv2.drawContours(roi, [cnt], -1, (0, 255, 0), 2)

cv2.createBackgroundSubtractorMOG2 함수는 매개변수를 정의하지 않고 처음에 추가되었습니다. 이제 결과를 더 개선하는 방법을 살펴보겠습니다. history 는 첫 번째 매개변수로, 이 경우 카메라가 고정되어 있으므로 100으로 설정합니다. var 값 이 낮을수록 오차 가능성이 커지기 때문에 Threshold 는  40입니다. 이 경우 더 큰 개체에만 관심이 있습니다.

# Object detection from Stable camera
object_detector = cv2.createBackgroundSubtractorMOG2(history=100, varThreshold=40)

사각형을 진행하기 전에 이미지를 추가로 정리합니다. 이를 위해 임계값 기능이 유용합니다. 마스크에서 시작하여 "254, 255"를 작성하여 254와 255 사이의 값만 고려하도록 흰색 또는 검은색 값만 표시하고 싶다고 말합니다.

_, mask = cv2.threshold(mask, 254, 255, cv2.THRESH_BINARY)

그런 다음 찾은 개체의 좌표를 if 조건에 삽입하고 사각형을 그립니다.

   x, y, w, h = cv2.boundingRect(cnt)
   cv2.rectangle(roi, (x, y), (x + w, y + h), (0, 255, 0), 3)

최종 결과입니다

 

이제 위치가 있는 배열을 tracker.update() 에 전달하겠습니다 . 위치가 있는 배열을 다시 가져오지만 추가로 각 개체에 고유한 ID가 할당됩니다.

직사각형을 그리고 차량 ID를 표시하기만 하면 됩니다.

 

전체소스 

tracker.py
0.00MB
main.py
0.00MB

'영상처리 > Object Tracking' 카테고리의 다른 글

BoT-SORT  (117) 2023.05.17
MOT(ByteTrack)  (102) 2023.05.16
profile

DataScience

@Ninestar

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!