OpenCV 로 레드벨벳 누나들 따라다니는 직캠 만들기
VScode python interpreter 변경하기
- command + shift + p
- select interpreter
- /Users/seon-uchan/opt/anaconda3/bin 선택
$ /Users/seon-uchan/opt/anaconda3/bin/python /Users/seon-uchan/Desktop/ML/BBang/main.py
돌릴 때는 아나콘다로 설치한 파이썬을 이용해야 opencv, numpy 등의 라이브러리를 이용 가능하므로 이렇게 해준다.
- Run
- 마우스로 ROI 선택
- space 바로 선택 완료
- 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를 다시 지정하게끔 만들어 주는 방법이 있다.
또한 추적 물체가 다른 사람 뒤로 숨었다가 나오는 경우 앞에있는 사람으로 따라가는 에러도 발생한다.
잘 따라 댕긴다.
'💡 AI > 토이 프로젝트' 카테고리의 다른 글
🧙 해리포터 투명망토 만들기 (0) | 2022.01.24 |
---|---|
Image Super Resolution (0) | 2022.01.24 |
🖕 뻐큐 모자이크 알고리즘 만들기 (1) | 2022.01.18 |
🍊 내 얼굴로 어노잉 오렌지 만들기 (0) | 2022.01.11 |
YOLOv5 커스텀 학습 튜토리얼 (0) | 2021.10.18 |