😎 κ³΅λΆ€ν•˜λŠ” μ§•μ§•μ•ŒνŒŒμΉ΄λŠ” μ²˜μŒμ΄μ§€?

[v0.34]μ˜μƒμ²˜λ¦¬_객체 좔적을 μœ„ν•œ Tracking API λ³Έλ¬Έ

πŸ‘©‍πŸ’» IoT (Embedded)/Image Processing

[v0.34]μ˜μƒμ²˜λ¦¬_객체 좔적을 μœ„ν•œ Tracking API

μ§•μ§•μ•ŒνŒŒμΉ΄ 2022. 1. 18. 01:07
728x90
λ°˜μ‘ν˜•

220118 μž‘μ„±

<λ³Έ λΈ”λ‘œκ·ΈλŠ” 귀퉁이 μ„œμž¬λ‹˜μ˜ λΈ”λ‘œκ·Έλ₯Ό μ°Έκ³ ν•΄μ„œ κ³΅λΆ€ν•˜λ©° μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€>

https://bkshin.tistory.com/entry/OpenCV-32-%EA%B0%9D%EC%B2%B4-%EC%B6%94%EC%A0%81%EC%9D%84-%EC%9C%84%ED%95%9C-Tracking-API?category=1148027 

 

OpenCV - 32. 객체 좔적을 μœ„ν•œ Tracking API

이번 ν¬μŠ€νŒ…μ—μ„œλŠ” 객체 좔적을 μœ„ν•œ Tracking API에 λŒ€ν•΄ λ°°μ›Œλ³΄κ² μŠ΅λ‹ˆλ‹€. 이번 ν¬μŠ€νŒ… μ—­μ‹œ '파이썬으둜 λ§Œλ“œλŠ” OpenCV ν”„λ‘œμ νŠΈ(μ΄μ„Έμš° μ €)'λ₯Ό μ •λ¦¬ν•œ κ²ƒμž„μ„ λ°νž™λ‹ˆλ‹€. μ½”λ“œ: github.com/BaekKyunShin/Open

bkshin.tistory.com

 

 

 

 

 

1. Tracking API

: Tracking APIλ₯Ό μ΄μš©ν•˜λ©΄ μ‰½κ²Œ 객체 좔적

: μΆ”μ ν•˜κ³ μž ν•˜λŠ” 객체만 지정해주면 APIκ°€ μ•Œμ•„μ„œ 객체λ₯Ό 좔적

: OpenCVμ—μ„œ μ œκ³΅ν•˜λŠ” Tracking APIμƒμ„±μž (μ•„λž˜)

  • tracker = cv2.TrackerBoosting_create() : AdaBoost μ•Œκ³ λ¦¬μ¦˜ 기반
  • tracker = cv2.TrackerMIL_create() : MIL(Multiple Instance Learning) μ•Œκ³ λ¦¬μ¦˜ 기반
  • tracker = cv2.TrackerKCF_create() : KCF(Kernelized Correlation Filters) μ•Œκ³ λ¦¬μ¦˜ 기반
  • tracker = cv2.TrackerTLD_create() : TLD(Tracking, Learning and Detection) μ•Œκ³ λ¦¬μ¦˜ 기반
  • tracker = cv2.TrackerMedianFlow_create() : 객체의 μ „λ°©ν–₯/μ—­λ°©ν–₯을 μΆ”μ ν•΄μ„œ λΆˆμΌμΉ˜μ„±μ„ μΈ‘μ •
  • tracker = cv2.TrackerGOTURN_cretae() : CNN(Convolutional Neural Networks) 기반 (OpenCV 3.4 λ²„κ·Έλ‘œ λ™μž‘X)
  • tracker = cv2.TrackerCSRT_create() : CSRT(Channel and Spatial Reliability)
  • tracker = cv2.TrackerMOSSE_create() : λ‚΄λΆ€μ μœΌλ‘œ 그레이 μŠ€μΌ€μΌ μ‚¬μš©

: μƒμ„±ν•œ TrackerλŠ” init() ν•¨μˆ˜λ‘œ μ΄ˆκΈ°ν™”

: init() ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„°λ‘œ 두 가지 (μž…λ ₯ μ˜μƒκ³Ό 좔적 λŒ€μƒ 객체가 μžˆλŠ” μ’Œν‘œ) 전달

 

retval = cv2.Tracker.init(img, boundingBox)

: Tracker μ΄ˆκΈ°ν™”

: μ΄ˆκΈ°ν™” ν›„ μƒˆλ‘œμš΄ μ˜μƒ ν”„λ ˆμž„μ—μ„œ 좔적 λŒ€μƒ 객체의 μœ„μΉ˜λ₯Ό μ°ΎκΈ° μœ„ν•΄ update() ν•¨μˆ˜λ₯Ό 호좜

 

- img: μž…λ ₯ μ˜μƒ
- boundingBox : 좔적 λŒ€μƒ 객체가 μžˆλŠ” μ’Œν‘œ (x, y)

 

retval, boundingBox = cv2.Tracker.update(img)

: μƒˆλ‘œμš΄ ν”„λ ˆμž„μ—μ„œ 좔적 λŒ€μƒ 객체 μœ„μΉ˜ μ°ΎκΈ°

 

- img: μƒˆλ‘œμš΄ ν”„λ ˆμž„ μ˜μƒ
- retval : 좔적 성곡 μ—¬λΆ€
- boundingBox : μƒˆλ‘œμš΄ ν”„λ ˆμž„μ—μ„œμ˜ 좔적 λŒ€μƒ 객체의 μƒˆλ‘œμš΄ μœ„μΉ˜ (x, y, w, h)

import cv2
import sys

# cv2 버전 확인
(major_ver, minor_ver, subminor_ver) = (cv2.__version__).split('.')

if __name__ == '__main__' :
    tracker_types = ['BOOSTING', 'MIL','KCF', 'TLD', 'MEDIANFLOW', 'GOTURN', 'MOSSE']
    tracker_type = tracker_types[2]

    if int(minor_ver) < 3:
        tracker = cv2.Tracker_create(tracker_type)
    else:
        if tracker_type == 'BOOSTING':
            tracker = cv2.TrackerBoosting_create()
        if tracker_type == 'MIL':
            tracker = cv2.TrackerMIL_create()
        if tracker_type == 'KCF':
            tracker = cv2.TrackerKCF_create()
        if tracker_type == 'TLD':
            tracker = cv2.TrackerTLD_create()
        if tracker_type == 'MEDIANFLOW':
            tracker = cv2.TrackerMedianFlow_create()
        if tracker_type == 'GOTURN':
            tracker = cv2.TrackerGOTURN_create()
        if tracker_type == 'MOSSE':
            tracker = cv2.TrackerMOSSE_create()

    # Read video
    video = cv2.VideoCapture("img/highway.mp4")

    # Exit if video not opened.
    if not video.isOpened():
        print ("Could not open video")
        sys.exit()

    # Read first frame.
    ok, frame = video.read()
    if not ok:
        print ('Cannot read video file')
        sys.exit()

    # Define an initial bounding box
    # bbox = (x,y,x+w,y+h)

    # Uncomment the line below to select a different bounding box
    bbox = cv2.selectROI(frame, False)

    # Initialize tracker with first frame and bounding box
    ok = tracker.init(frame, bbox)

    while True:
        # Read a new frame
        ok, frame = video.read()
        if not ok:
            break

        # Start timer
        timer = cv2.getTickCount()

        # Update tracker
        ok, bbox = tracker.update(frame)

        # Calculate Frames per second (FPS)
        fps = cv2.getTickFrequency() / (cv2.getTickCount() - timer);

        # Draw bounding box
        if ok:
            # Tracking success
            p1 = (int(bbox[0]), int(bbox[1]))
            p2 = (int(bbox[0] + bbox[2]), int(bbox[1] + bbox[3]))
            cv2.rectangle(frame, p1, p2, (255,0,0), 2, 1)
        else :
            # Tracking failure
            cv2.putText(frame, "Tracking failure detected", (100,80), cv2.FONT_HERSHEY_SIMPLEX, 0.75,(0,0,255),2)

        # Display tracker type on frame
        cv2.putText(frame, tracker_type + " Tracker", (100,20), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50,170,50),2);

        # Display FPS on frame
        cv2.putText(frame, "FPS : " + str(int(fps)), (100,50), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50,170,50), 2);

        # Display result
        cv2.imshow("Tracking", frame)

        # Exit if ESC pressed
        k = cv2.waitKey(1) & 0xff
        if k == 27 : break

좔적을 μ›ν•˜λŠ” 객체
Tracking APIλ₯Ό μ΄μš©ν•΄μ„œ 객체λ₯Ό 좔적

- μ½”λ“œλ₯Ό 처음 μ‹€ν–‰ν•˜λ©΄ 화면이 멈좰있음

- 좔적을 μ›ν•˜λŠ” 객체λ₯Ό λ“œλž˜κ·Έ + λ‹€μŒμœΌλ‘œ 슀페이슀(space) ν‚€λ₯Ό λˆ„λ₯΄κΈ°

- μžλ™μœΌλ‘œ μž¬μƒλ˜κ³ , 객체 좔적을 μ‹œμž‘

- ν‚€λ³΄λ“œ 0~7 숫자 ν‚€λ₯Ό 눌러 νŠΈλž™μ»€ μ•Œκ³ λ¦¬μ¦˜μ„ 선택 κ°€λŠ₯

- λ‹€λ§Œ 5λ₯Ό λˆ„λ₯΄λ©΄ 였λ₯˜κ°€ λœ¨λ©΄μ„œ μ’…λ£Œ (λ²„κ·Έλ•œμ‹œ)

- ν™”λ©΄ μƒλ‹¨μ˜ 0 : TrackerBoosting, 1 : TrackerMIL 등이 λœ¬λ‹€

- ν˜„μž¬ μ–΄λ–€ νŠΈλž™μ»€λ‘œ 객체 좔적을 ν•˜κ³  μžˆλŠ”μ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” ν‘œμ‹œ

 

 

 

 

 

 

 

 

 

 

μ˜€ν™ 이런걸둜 μžμœ¨μ£Όν–‰ ν•˜λŠ”κ³€κ°•

 

728x90
λ°˜μ‘ν˜•
Comments