๋ฐ์ํ
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.
๋ฐ์ํ
'๐ Computer Vision' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[CV] Object Detection Network ๊ตฌ์กฐ, R-CNN ๊ฐ์ (0) | 2024.05.22 |
---|---|
[CV] Object Detection & Segmentation์ ์ํ ํจํค์ง & CUDA ์๊ฐ (0) | 2024.05.20 |
[CV] OpenCV ๊ฐ์ (0) | 2024.05.18 |
[CV] Object Detection & Segmentation์ ์ํ ์ฃผ์ Dataset (0) | 2024.05.17 |
[CV] Precision(์ ๋ฐ๋) & Recall(์ฌํ์จ) (0) | 2024.05.15 |