와챠의 우당탕탕 코딩 일기장

[OpenCV] opencv 기초 + tracking 본문

이런 저런 공부

[OpenCV] opencv 기초 + tracking

minWachya 2023. 3. 19. 20:56
반응형

강의 보면서 코드 따라치기 연습

 

1. OpenCV 소개 및 기본 사용법:

고양이 사진 출력 & 흑백 사진으로 변경 & 파일 저장

https://www.youtube.com/watch?v=F2FRpmh9sQo 

 

 

# 이미지 읽어서 살펴보기
import cv2

# 이미지 읽어서 Numpy 객체로 만들기
# cv2.imread(file_name, flag)
# 주의: openCV: RGB가 아닌 BGR! + Matplotlib: RGB
img_basic = cv2.imread('venv/dog.jpeg', cv2.IMREAD_COLOR)

# 이미지 화면에 출력
# cv2.imshow(title, image)
cv2.imshow('Image Basic', img_basic)

# 키보드 입력 처리
# cv2.waitKey(time)
# time: 입력 대기시간, 0==무한대기
cv2.waitKey(0)

# 이미지를 파일로 저장
# cv2.imwrite(fime_name, image)
cv2.imwrite('result1.png', img_basic)

# 흑백으로 이미지 변경
img_gray = cv2.cvtColor(img_basic, cv2.COLOR_BGR2GRAY)
cv2.imshow('Image Basic', img_gray)
cv2.waitKey(0)
cv2.imwrite('result2.png', img_gray)

# 화면의 모든 윈도우 닫기
cv2.destroyAllWindows()

 

 

2. 물체추적으로 BTS 오빠를 따라다니는 직캠을 만들어보자 - Python

https://www.youtube.com/watch?v=cx7VONjFEE0 

 

 

원본: https://youtu.be/d8_rraDDSOw

출력:

newjeans_ditto2_output.mp4
0.77MB

import cv2
import numpy as np

video_path = 'newjeans_ditto2.mp4'
cap = cv2.VideoCapture(video_path)

# 영상 저장하기
output_size = [100, 250] # (width, height)
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)

if not cap.isOpened():
    exit()

# 트레커
tracker = cv2.TrackerCSRT_create()

# 첫 프레임 읽기
ret, img = cap.read()
cv2.namedWindow('Select Window')
cv2.imshow('Select Window',img)

# ROI 설정: 첫 프레임에서 설정한 ROI가 rect에 저장됨
rect = cv2.selectROI('Select Window', img, fromCenter=False, showCrosshair=True)
cv2.destroyWindow('Select Window')

# tracker 설정: rect를 계속 쫒게 만듦
tracker.init(img, rect)

while True:
    ret, img = cap.read()

    if not ret:
        exit()

    # 다음 프레임에서도 계속 쫒기
    success, box = tracker.update(img)

    # 트레킹하고 있는 거 출력 + 저장
    left, top, w, h = [int(v) for v in box]
    # 트레킹하는 부분 중심을 기준으로 전신 박스 잡기
    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('img', img)
    if cv2.waitKey(1) == ord('q'):
        break

 


졸프 전 구현할 기술들 미리 맛보기중!!

트레킹 재밌다..신기하다

그리고 기능에 비해 코드가 엄청 간결하다. 충격적..^^

반응형
Comments