OpenCV 로 레드벨벳 누나들 따라다니는 직캠 만들기


VScode python interpreter 변경하기

 

  1. command + shift + p
  2. select interpreter
  3. /Users/seon-uchan/opt/anaconda3/bin 선택
$ /Users/seon-uchan/opt/anaconda3/bin/python /Users/seon-uchan/Desktop/ML/BBang/main.py

돌릴 때는 아나콘다로 설치한 파이썬을 이용해야 opencv, numpy 등의 라이브러리를 이용 가능하므로 이렇게 해준다.


  1. Run
  2. 마우스로 ROI 선택
  3. space 바로 선택 완료
  4. q로 종료

 

트래킹은 계속 하지만, 영상이 짤릴 경우에도 예외처리 해주어야 한다.

그리고 핸드폰 사이즈로 볼 수 있게 영상을 저장한다.

 

# -*- coding: utf-8 -*-
import cv2
import numpy as np

video_path = 'redvelvet.mp4'
cap = cv2.VideoCapture(video_path) #  비디오 읽기

# output_size = (375, 667) # 저장할 영상을 핸드폰 사이즈로 
# 영상이 작으면 에러가 날 수 있다.
output_size = (187,333)

# 영상 저장
fourcc = cv2.VideoWriter_fourcc('m','p','4','v')
out = cv2.VideoWriter('%s_output.mp4' %(video_path.split('.')[0]), fourcc, cap.get(cv2.CAP_PROP_FPS), output_size)
# cv2.VideoWriter : 비디오 출력 모듈 초기화

if not cap.isOpened():
    exit()

#1
tracker = cv2.TrackerCSRT_create() 

ret, img = cap.read()
cv2.namedWindow('Select Window') 
cv2.imshow('Select Window', img)

# 2. setting ROI
rect = cv2.selectROI('Select Window', img, fromCenter=False, showCrosshair=True)
# ROI 설정하고 윈도우 닫자
cv2.destroyWindow('Select Window')
# 마우스드래그로 ROI 지정 하고 스페이스바 누르면 ROI가 지정돼서 ROI 정보가 rect에 저장된다.

# 3. initialize tracker
tracker.init(img, rect) # rect로 설정한 부븐을 트래킹하면 된다고 인식하게 된다.

while True:
    ret, img = cap.read() # video 읽어서 img에 저장

    if not ret: # 잘못 읽었다, 또는 비디오가 끝났다면 ret이 false가 된다.
        exit() # 프로그램 종료

    success, box = tracker.update(img) # img에서 rect로 설정한 이미지와 비슷한 물체의 위치를 찾아 반환한다.
    # success : 성공 했는지 안했는지 boolean으로, box : ROI설정 한 것처럼 rec 형태의 데이터로

    left, top, w, h = [int(v) for v in box] # 한번 돌때마다 v의 값을 int로 변환한 다음에 왼쪽,오른쪽 다 넣자
    
    center_x = left + w/2
    center_y = top + h/2

    result_top = int(center_y - output_size[1] / 2)
    result_bottom = int(center_y + output_size[1] / 2)
    result_left = int(center_x - output_size[0] / 2)
    result_right = int(center_x + output_size[0] / 2)

    result_img = img[result_top:result_bottom, result_left:result_right].copy()

    out.write(result_img)

    # 사각형 그리기
    cv2.rectangle(img, pt1=(left, top), pt2=(left + w, top + h), color=(255, 255, 255), thickness=3)

    cv2.imshow('result_img', result_img)
    cv2.imshow('img', img) # 이미지 보여주기
    if cv2.waitKey(1)==ord('q'): # 1 ms 동안 기다린다. 꼭 써주어야 한다.
        break

 

중간에 트래킹 대상이 사라지면, resize 함수에서 오류가 나서 프로그램이 죽는다.

그럴 경우 ROI를 다시 지정하게끔 만들어 주는 방법이 있다.

 

또한 추적 물체가 다른 사람 뒤로 숨었다가 나오는 경우 앞에있는 사람으로 따라가는 에러도 발생한다.

 

 

원본 영상

 

 

tracking 한 output 영상

 

잘 따라 댕긴다.

 

복사했습니다!