Object Tracking이 구현된 파이썬 코드 공부하기
전체 코드
코드 출처 : 파이썬으로 만드는 OpenCV 프로젝트(이세우 저)
import cv2
trackers = [cv2.TrackerBoosting_create,
            cv2.TrackerMIL_create,
            cv2.TrackerKCF_create,
            cv2.TrackerTLD_create,
            cv2.TrackerMedianFlow_create,
            cv2.TrackerGOTURN_create, 
            cv2.TrackerCSRT_create,
            cv2.TrackerMOSSE_create]
trackerIdx = 0  
tracker = None
isFirst = True
video_src = 0 
video_src = "./soccer.mp4"
cap = cv2.VideoCapture(video_src)
fps = cap.get(cv2.CAP_PROP_FPS)
delay = int(1000/fps)
win_name = 'Tracking APIs'
while cap.isOpened():
    ret, frame = cap.read()
    
    # (+추가) 동영상 크기 조정을 위한 코드
    frame=cv2.resize(frame, dsize=None, fx=0.5, fy=0.5)
    
    if not ret:
        print('Cannot read video file')
        break
    
    img_draw = frame.copy()
    
    if tracker is None: 
        cv2.putText(img_draw, "Press the Space to set ROI!!", \
            (100,80), cv2.FONT_HERSHEY_SIMPLEX, 0.75,(0,0,255),2,cv2.LINE_AA)
    else:
        ok, bbox = tracker.update(frame)   
        (x,y,w,h) = bbox
        if ok: # 추적 성공
            cv2.rectangle(img_draw, (int(x), int(y)), (int(x + w), int(y + h)), \
                          (0,255,0), 2, 1)
        else : # 추적 실패
            cv2.putText(img_draw, "Tracking fail.", (100,80), \
                        cv2.FONT_HERSHEY_SIMPLEX, 0.75,(0,0,255),2,cv2.LINE_AA)
                
    trackerName = tracker.__class__.__name__
    
    cv2.putText(img_draw, str(trackerIdx) + ":"+trackerName , (100,20), \
                 cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0,255,0),2,cv2.LINE_AA)
    cv2.imshow(win_name, img_draw)
    
    key = cv2.waitKey(delay) & 0xff
    if key == ord(' ') or (video_src != 0 and isFirst): 
        isFirst = False
        roi = cv2.selectROI(win_name, frame, False) 
        if roi[2] and roi[3]:    
            tracker = trackers[trackerIdx]()   
            isInit = tracker.init(frame, roi)
    elif key in range(48, 56): 
        trackerIdx = key-48    
        if bbox is not None:
            tracker = trackers[trackerIdx]() 
            isInit = tracker.init(frame, bbox) 
    elif key == 27 : 
        break
    
else:
    print( "Could not open video")
cap.release()
cv2.destroyAllWindows()
코드 실행



Object Tracking??
시간이 지남에 따라 움직이는 물체를 찾는 과정
OpenCV??
실시간 컴퓨터 비전을 목적으로 한 프로그래밍 라이브러리
컴퓨터비전??
기계의 시각에 해당하는 부분을 연구하는 컴퓨터 과학의 최신 연구 분야 중 하나
💻 OpenCV 패키지 선언
import cv2
💻 트래커 객체 생성자 리스트 선언
trackers = [cv2.TrackerBoosting_create,
            cv2.TrackerMIL_create,
            cv2.TrackerKCF_create,
            cv2.TrackerTLD_create,
            cv2.TrackerMedianFlow_create,
            cv2.TrackerGOTURN_create, 
            cv2.TrackerCSRT_create,
            cv2.TrackerMOSSE_create]
- 
cv.TrackerBoosing_create()
AdaBoost 알고리즘 기반
참고자료
 - 
cv2.TrackerMIL_create()
MIL(Multiple Instance Learning) 알고리즘 기반
참고자료 - 
cv2.TrackerKCF_create()
KCF(Kernelized Correlation Filters) 알고리즘 기반 - 
cv2.TrackerTLD_create()
TLD(Tracking, Learning and Detection) 알고리즘 기반
참고자료 - 
cv2.TrackerMedianFlow_create()
객체의 전방향/역방향을 추적해서 불일치성을 측정 - 
cv2.TrackerGOTURN_create()
CNN(Convolutional Neural Networks) 기반
참고자료 - 
cv2.TrackerCSRT_create()
CSRT(Channel and Spatial Reliability) - 
cv2.TrackerMOSSE_create()
내부적으로 그레이 스케일 사용
 
💻 카메라, 동영상 선택
video_src = 0 # 첫 번째로 연결된 캠과 연결됨
video_src = "./soccer.mp4" # 동영상과 연결됨
- 트래킹 대상에 따라 적절히 코드를 작성
 - 현재는 동영상에 트래킹을 적용하기 때문에 첫 번째 줄은 없어도 됨
 
💻 카메라(or 동영상) 열기
cap = cv2.VideoCapture(video_src)
💻 초당 프레임 수 구하기
fps = cap.get(cv2.CAP_PROP_FPS)
💻 딜레이 계산
delay = int(1000/fps)
- 동영상을 적절한 속도로 재생하기 위해 딜레이를 구함
 
💻 프레임 읽기
ret, frame = cap.read()
- 재생되는 비디오의 한 프레임씩 읽음
 - 프레임을 제대로 읽으면 ret 값은 True, 아니면 False
 
💻 관심영역 설정하기
img_draw = frame.copy()
📷 트래커가 생성되지 않았을 때
if tracker is None: 
    cv2.putText(img_draw, "Press the Space to set ROI!!", \
        (100,80), cv2.FONT_HERSHEY_SIMPLEX, 0.75,(0,0,255),2,cv2.LINE_AA)
📷 트래커가 생성되었을 때
else:
    ok, bbox = tracker.update(frame)   
    (x,y,w,h) = bbox
    if ok: # 추적 성공
        cv2.rectangle(img_draw, (int(x), int(y)), (int(x + w), int(y + h)), 
        \(0,255,0), 2, 1)
    else : # 추적 실패
        cv2.putText(img_draw, "Tracking fail.", (100,80), \
                    cv2.FONT_HERSHEY_SIMPLEX, 0.75 (0,0,255),2,cv2.LINE_AA)
- 새로운 프레임에서 추적 위치를 찾는 코드
 
ok, bbox = tracker.update(frame) 
- 추적 위치를 찾았다면 드래그 된 곳을 추적 공간으로 지정 (직사각형)
 
cv2.rectangle(img_draw, (int(x), int(y)), (int(x + w), int(y + h)),
  \(0,255,0), 2, 1)
💻 어떤 트래커가 사용 되었는지 알려주기
trackerName = tracker.__class__.__name__
    
cv2.putText(img_draw, str(trackerIdx) + ":"+trackerName , (100,20), \
                 cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0,255,0),2,cv2.LINE_AA)
💻 윈도우에 보여주기
cv2.imshow(win_name, img_draw)
- img_draw 
: 트래커가 추적하는 부분 (직사각형)
 
💻 키보드 이벤트 처리
⚡ 키보드 입력 대기
key = cv2.waitKey(delay) & 0xff
- delay 만큼 프로그램을 멈추고 있다가 키보드의 눌린 키에 대응하는 값을 반환
 
💡 스페이스 바 또는 비디오 파일 최초 실행
if key == ord(' ') or (video_src != 0 and isFirst): 
    isFirst = False
    roi = cv2.selectROI(win_name, frame, False) 
    if roi[2] and roi[3]:    
        tracker = trackers[trackerIdx]()   
        isInit = tracker.init(frame, roi)
- 초기 객체의 위치 설정
 
roi = cv2.selectROI(win_name, frame, False)
- 위치 설정 값이 있는 경우 트래커 객체 생성
 
 if roi[2] and roi[3]:    
     tracker = trackers[trackerIdx]()   
     isInit = tracker.init(frame, roi)
- 객체를 초기화 하는 부분
 
isInit = tracker.init(frame, roi)
💡 스페이스 바 또는 비디오 파일 최초 실행이 아닐 경우
elif key in range(48, 56): 
    trackerIdx = key-48    
    if bbox is not None:
        tracker = trackers[trackerIdx]() 
        isInit = tracker.init(frame, bbox) 
- 키보드 숫자 키 참고
출처

 
- 선택한 숫자로 트래커 인덱스 설정
 
trackerIdx = key-48 
- 선택한 숫자의 트랙커 객체 생성
 
tracker = trackers[trackerIdx]() 
💡 종료 (나가기)
elif key == 27 : 
    break
💻 오픈한 객체 해제하기
cap.release()
cv2.destroyAllWindows()
                Author And Source
이 문제에 관하여(Object Tracking이 구현된 파이썬 코드 공부하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@yglee730/Object-Tracking이-구현된-파이썬-코드-공부하기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)