A A
[CV] OpenCV ์˜์ƒ์ฒ˜๋ฆฌ ๊ฐœ์š”

OpenCV ์˜์ƒ ์ฒ˜๋ฆฌ ๊ฐœ์š”

ํ•œ๋ฒˆ OpenCV์˜ ์˜์ƒ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์— ๋ฐํ•˜์—ฌ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • OpenCV์˜ VideoCaptureํด๋ž˜์Šค๋Š” ๋™์˜์ƒ์„ ๊ฐœ๋ณ„ Frame์œผ๋กœ ํ•˜๋‚˜์”ฉ ์ฝ์–ด(Read)๋“ค์ด๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • VideoWriter๋Š” VideoCapture๋กœ ์ฝ์–ด๋“ค์ธ ๊ฐœ๋ณ„ Frame์„ ๋™์˜์ƒ ํŒŒ์ผ๋กœ Write๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • VideoCapture.read() - ์˜์ƒ์˜ ๋‹ค์Œ Frame์„ ์ฝ์Šต๋‹ˆ๋‹ค.
  • VideoWriter.write() - ์˜์ƒ์˜ Frame์„ write ํ•ฉ๋‹ˆ๋‹ค.
cap = cv2.VideoCapture(video_input_path)
……
……
vid_writer = cv2.VideoWriter(video_output_path, …..)
while True:
hasFrame, img_frame = cap.read()
if not hasFrame:
print('๋” ์ด์ƒ ์ฒ˜๋ฆฌํ•  frame์ด ์—†์Šต๋‹ˆ๋‹ค.')
break
vid_writer.write(img_frame))

 Video Capture ๊ฐœ์š”

  • VideoCapture๊ฐ์ฒด๋Š” ์ƒ์„ฑ ์ธ์ž๋กœ ์ž…๋ ฅ video ํŒŒ์ผ ์œ„์น˜๋ฅผ ๋ฐ›์•„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
cap = cv2.VideoCapture(video_input_path)
  • VideoCapture๊ฐ์ฒด๋Š” ์ž…๋ ฅ video ํŒŒ์ผ์˜ ๋‹ค์–‘ํ•œ ์†์„ฑ์„ ๊ฐ€์ ธ ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜์ƒ Frame ๋„ˆ๋น„ : cap.get(cv2.CAP_PROP_FRAME_WIDTH)
์˜์ƒ Frame ๋†’์ด : cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
์˜์ƒ FPS: cap.get(cv2.CAP_PROP_FPS )
  • VideoCapture๊ฐ์ฒด์˜ read( )๋Š” ๋งˆ์ง€๋ง‰ Frame๊นŒ์ง€ ์ฐจ๋ก€๋กœ Frame์„ ์ฝ์Šต๋‹ˆ๋‹ค.
while True:
	hasFrame, img_frame = cap.read()
	if not hasFrame:
		print('๋” ์ด์ƒ ์ฒ˜๋ฆฌํ•  frame์ด ์—†์Šต๋‹ˆ๋‹ค.')
		break

VideoWriter ๊ฐœ์š”

  • VideoWriter ๊ฐ์ฒด๋Š” writeํ•  ๋™์˜์ƒ ํŒŒ์ผ ์œ„์น˜, Encoding์ฝ”๋ฑ ์œ ํ˜•, write fps ์ˆ˜์น˜, frame ํฌ๊ธฐ๋ฅผ ์ƒ์„ฑ์ž๋กœ ์ž…๋ ฅ ๋ฐ›์•„ ์ด๋“ค ๊ฐ’์— ๋”ฐ๋ฅธ ๋™์˜์ƒ Write๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • VideoWriter๋Š” write์‹œ ํŠน์ • ํฌ๋งท์œผ๋กœ ๋™์˜์ƒ์„ Encoding ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (DIVX, XVID, MJPG, X264, WMV1, WMV2)
cap = cv2.VideoCapture(video_input_path)

codec = cv2.VideoWriter_fourcc(*'XVID')

vid_size = (round(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),round(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
vid_fps = cap.get(cv2.CAP_PROP_FPS )

vid_writer = cv2.VideoWriter(video_output_path, codec, vid_fps, vid_size)

OpenCV ์˜์ƒ์ฒ˜๋ฆฌ Code (by Python)

  • OpenCV๋Š” ๊ฐ„ํŽธํ•˜๊ฒŒ ๋น„๋””์˜ค ์˜์ƒ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • VideoCapture ๊ฐ์ฒด๋Š” Video Streaming์„ Frame ๋ณ„๋กœ Captureํ•˜์—ฌ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • VideoWriter ๊ฐ์ฒด๋Š” VideoCapture๋กœ ์ฝ์–ด๋“ค์ธ Frame์„ ๋™์˜์ƒ์œผ๋กœ Writeํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
# wget https://github.com/chulminkw/DLCV/blob/master/data/video/Night_Day_Chase.mp4?raw=true ์œผ๋กœ ๋‹ค์šด๋กœ๋“œ ๊ฐ€๋Šฅ.
from IPython.display import clear_output, Image, display, Video, HTML
Video('/content/drive/MyDrive/แ„ƒแ…ตแ†ธแ„…แ…ฅแ„‚แ…ตแ†ผ แ„แ…ฅแ†ทแ„‘แ…ฒแ„แ…ฅ แ„‡แ…ตแ„Œแ…ฅแ†ซ แ„€แ…กแ„‹แ…ตแ„ƒแ…ณ/Deep_learning computer Vision Guide/data/video/Night_Day_Chase.mp4')

 

  • video_input_path ๋ณ€์ˆ˜์— ์ž…๋ ฅ ๋™์˜์ƒ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • video_output_path ๋ณ€์ˆ˜์— ์ถœ๋ ฅ ๋™์˜์ƒ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • cv2.VideoCapture(video_input_path)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž…๋ ฅ ๋™์˜์ƒ ํŒŒ์ผ์„ ์—ฝ๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ๋™์˜์ƒ ํŒŒ์ผ์„ ์ €์žฅํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ฝ”๋ฑ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” 'XVID' ์ฝ”๋ฑ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. cv2.VideoWriter_fourcc(*'XVID')๋Š” FourCC ์ฝ”๋ฑ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
import cv2

video_input_path = '/content/drive/MyDrive/แ„ƒแ…ตแ†ธแ„…แ…ฅแ„‚แ…ตแ†ผ แ„แ…ฅแ†ทแ„‘แ…ฒแ„แ…ฅ แ„‡แ…ตแ„Œแ…ฅแ†ซ แ„€แ…กแ„‹แ…ตแ„ƒแ…ณ/Deep_learning computer Vision Guide/data/video/Night_Day_Chase.mp4'
# linux์—์„œ video output์˜ ํ™•์žฅ์ž๋Š” ๋ฐ˜๋“œ์‹œ avi ๋กœ ์„ค์ • ํ•„์š”.
video_output_path = '/content/drive/MyDrive/แ„ƒแ…ตแ†ธแ„…แ…ฅแ„‚แ…ตแ†ผ แ„แ…ฅแ†ทแ„‘แ…ฒแ„แ…ฅ แ„‡แ…ตแ„Œแ…ฅแ†ซ แ„€แ…กแ„‹แ…ตแ„ƒแ…ณ/Deep_learning computer Vision Guide/data/video/Night_Day_Chase_output.avi'

cap = cv2.VideoCapture(video_input_path)
# Codec์€ *'XVID'๋กœ ์„ค์ •.
codec = cv2.VideoWriter_fourcc(*'XVID')

vid_size = (round(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),round(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))) #(200, 400)
vid_fps = cap.get(cv2.CAP_PROP_FPS )

vid_writer = cv2.VideoWriter(video_output_path, codec, vid_fps, vid_size)

frame_cnt = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
print('์ด Frame ๊ฐฏ์ˆ˜:', frame_cnt, 'FPS:', round(vid_fps), 'Frame ํฌ๊ธฐ:', vid_size)

 

 

Frame ์ฒ˜๋ฆฌ Code

import cv2
import time

# ๊ฒฝ๋กœ๋Š” ์‚ฌ์šฉ์ž ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ์ˆ˜์ • ํ•„์š”
video_input_path = '/content/drive/MyDrive/แ„ƒแ…ตแ†ธแ„…แ…ฅแ„‚แ…ตแ†ผ แ„แ…ฅแ†ทแ„‘แ…ฒแ„แ…ฅ แ„‡แ…ตแ„Œแ…ฅแ†ซ แ„€แ…กแ„‹แ…ตแ„ƒแ…ณ/Deep_learning computer Vision Guide/data/video/Night_Day_Chase.mp4'
video_output_path = '/content/drive/MyDrive/แ„ƒแ…ตแ†ธแ„…แ…ฅแ„‚แ…ตแ†ผ แ„แ…ฅแ†ทแ„‘แ…ฒแ„แ…ฅ แ„‡แ…ตแ„Œแ…ฅแ†ซ แ„€แ…กแ„‹แ…ตแ„ƒแ…ณ/Deep_learning computer Vision Guide/data/video/Night_Day_Chase_output.avi'

cap = cv2.VideoCapture(video_input_path)
codec = cv2.VideoWriter_fourcc(*'XVID')

vid_size = (round(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), round(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
vid_fps = cap.get(cv2.CAP_PROP_FPS)

vid_writer = cv2.VideoWriter(video_output_path, codec, vid_fps, vid_size)

green_color = (0, 255, 0)
red_color = (0, 0, 255)

start = time.time()
index = 0
while True:
    hasFrame, img_frame = cap.read()
    if not hasFrame:
        print('๋” ์ด์ƒ ์ฒ˜๋ฆฌํ•  frame์ด ์—†์Šต๋‹ˆ๋‹ค.')
        break
    index += 1
    print('frame :', index, '์ฒ˜๋ฆฌ ์™„๋ฃŒ')
    cv2.rectangle(img_frame, (300, 100, 800, 400), color=green_color, thickness=2)
    caption = "frame:{}".format(index)
    cv2.putText(img_frame, caption, (300, 95), cv2.FONT_HERSHEY_SIMPLEX, 0.7, red_color, 1)

    vid_writer.write(img_frame)

print('write ์™„๋ฃŒ ์‹œ๊ฐ„:', round(time.time() - start, 4))
vid_writer.release()
cap.release()

 

  • cap.read(): ๋™์˜์ƒ์—์„œ ๋‹ค์Œ ํ”„๋ ˆ์ž„์„ ์ฝ์Šต๋‹ˆ๋‹ค. hasFrame์€ ํ”„๋ ˆ์ž„์„ ์„ฑ๊ณต์ ์œผ๋กœ ์ฝ์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ , img_frame์€ ์ฝ์€ ํ”„๋ ˆ์ž„์ž…๋‹ˆ๋‹ค.
    • ํ”„๋ ˆ์ž„์„ ๋” ์ด์ƒ ์ฝ์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ๋ฃจํ”„๋ฅผ ์ข…๋ฃŒํ•˜๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  • index += 1: ์ฒ˜๋ฆฌ๋œ ํ”„๋ ˆ์ž„ ์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.
  • print('frame :', index, '์ฒ˜๋ฆฌ ์™„๋ฃŒ'): ํ˜„์žฌ ํ”„๋ ˆ์ž„ ๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  • cv2.rectangle(img_frame, (300, 100, 800, 400), color=green_color, thickness=2): ํ”„๋ ˆ์ž„์— ์ดˆ๋ก์ƒ‰ ์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.
  • cv2.putText(img_frame, caption, (300, 95), cv2.FONT_HERSHEY_SIMPLEX, 0.7, red_color, 1): ํ”„๋ ˆ์ž„ ๋ฒˆํ˜ธ๋ฅผ ๋นจ๊ฐ„์ƒ‰ ํ…์ŠคํŠธ๋กœ ํ”„๋ ˆ์ž„์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • vid_writer.write(img_frame): ์ฒ˜๋ฆฌ๋œ ํ”„๋ ˆ์ž„์„ ์ถœ๋ ฅ ๋™์˜์ƒ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค
  • ์ฝ”๋“œ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” frame์ด ์–ผ๋งˆ๋‚˜ ์ฒ˜๋ฆฌ๋˜์—ˆ๋Š”์ง€ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. frame 1~1383๊นŒ์ง€ ์ฒ˜๋ฆฌ ํ•ฉ๋‹ˆ๋‹ค.
frame : 1 ์ฒ˜๋ฆฌ ์™„๋ฃŒ
frame : 2 ์ฒ˜๋ฆฌ ์™„๋ฃŒ
frame : 3 ์ฒ˜๋ฆฌ ์™„๋ฃŒ

...

frame : 1380 ์ฒ˜๋ฆฌ ์™„๋ฃŒ
frame : 1381 ์ฒ˜๋ฆฌ ์™„๋ฃŒ
frame : 1382 ์ฒ˜๋ฆฌ ์™„๋ฃŒ
frame : 1383 ์ฒ˜๋ฆฌ ์™„๋ฃŒ
๋” ์ด์ƒ ์ฒ˜๋ฆฌํ•  frame์ด ์—†์Šต๋‹ˆ๋‹ค.
write ์™„๋ฃŒ ์‹œ๊ฐ„: 9.3116
  •  

 

  • ๊ทธ๋ฆฌ๊ณ  ์ด๋ ‡๊ฒŒ Frame์„ ์ฒ˜๋ฆฌํ•œ ์˜์ƒ์€ ๋‚˜์˜ bucket์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
!gsutil cp ../../data/output/Night_Day_Chase_output.avi gs://my_bucket_dlcv/data/output/Night_Day_Chase_output.avi
Copying file://../../data/output/Night_Day_Chase_output.avi [Content-Type=video/x-msvideo]...
/ [1 files][ 23.5 MiB/ 23.5 MiB]                                                
Operation completed over 1 objects/23.5 MiB.