# 실습
import cv2
# 파일을 다룰 떄는 예외처리를 해주는 것이 오류로 인해 실행 중지되는 것을 방지
try:
# 카메라가 연결된 경우
# cap = cv2.VideoCapture(0)
# 동영상 파일인 경우
cap = cv2.VideoCapture(0)
# ip가 부여된 원격의 웹 카메라인 경우
# cap = cv2.VideoCapture("rtsp:127.0.0.1/0")
print('비디오 캡쳐 시작')
except :
print('비디오 캡처 실패')
# 비디오가 캡처되었다면
while cap.isOpened():
ret, frame = cap.read()
# 프레임 이미지: 영상에 포함된 1장의 이미지
# 이미지를 읽지 못하거나 전체 영상을 모두 플레이 한 경우
if not ret: # ret이 False일 때 실행
print('이미지 읽기 실패 또는 전체 영상 플레이 완료')
break
cv2.imshow("video", frame)
key = cv2.waitKey(33)
if key == 49: # 아스키 코드표 49 = 숫자1
break
cap.release() # 비디오 객체 종료
cv2.destroyAllWindows() # 모든 창 닫기
import ipywidgets as widgets
from IPython.display import display
import cv2
import threading
# 전역변수 선언
global stop
stop = True
# 함수 선언
def on_button_clicked(event):
# 함수 내부에서도 선언을 해줘야한다
global stop
stop = False
try :
cap = cv2.VideoCapture('./images/video.mp4')
print('비디오 캡처 시작')
except :
print('비디오 캡처 실패')
w = cap.get(3)
h = cap.get(4)
# 영상 사이즈를 조절해서 위젯 이미지 객체를 생성해보자
image_widget = widgets.Image(format = 'jpeg', width = w / 2, height = h / 2)
# 버튼 위젯
button = widgets.Button(description = '중지', icon = 'stop')
button.on_click(on_button_clicked)
display(button, image_widget)
def funtion():
while stop :
ret, frame = cap.read()
if not ret :
print('프레임이미지 읽기 실패')
break
# frame 이미지를 jpeg 값으로 인코딩하고 배열 데이터를 byte 객체로 변환해서
# 위젯 이미지 객체값으로 저장해주기
encoed_state, encoded_image = cv2.imencode('.jpeg', frame)
try :
cv2.waitKey(33) # 초당 프레임 30간격으로 샘플링(재생속도 제어)
image_widget.value = encoded_image.tobytes()
except :
break
cap.release()
threading.Thread(target = funtion).start()
# 실습
import cv2
cap = cv2.VideoCapture('./images/drowsiness_all.mp4')
# 카메라로부터 영상 획득
#cap = cv2.VideoCapture(0)
# 녹화 설정
fps = 30.0 # 초당 프레임 이미지 수
# 영상의 크기
w=int(cap.get(3))
h=int(cap.get(4))
# codec 설정
codec = cv2.VideoWriter_fourcc(*'MP4V')
# 녹화파일 설정
out = cv2.VideoWriter('녹화중.mp4',codec,fps,(w,h))
# 녹화 여부 설정
record = False
# 비디오가 캡처 되었다면
while cap.isOpened():
ret, frame = cap.read()
if not ret :
print('이미지 읽기 실패')
break
cv2.imshow('video',frame)
key = cv2.waitKey(33)
if key==49:
print('녹화종료')
break
elif key ==50: # 숫자 2
print('녹화시작')
record = True
if record:
out.write(frame)
cap.release()
out.release()
cv2.destroyAllWindows()
2번 키를 누르면 카메라화면이 저장됨.
# 실습
import cv2
# cap =cv2.VideoCapture('./images/video.mp4')
cap =cv2.VideoCapture(0)
# 파일명 구분하기 위한 카운터
co = 0
while cap.isOpened() :
ret, frame = cap.read()
if not ret :
print('이미지 읽기 실패')
break
cv2.imshow('video', frame)
key = cv2.waitKey(33)
if key == 49 :# 49 → 숫자 1
break
elif key == 50 : # 숫자2
co += 1
print(f"images/pic_{co}.png 파일 저장")
cv2.imwrite(f"images/pic_{co}.png", frame, params = [cv2.IMWRITE_PNG_COMPRESSION, 0])
cap.release()
cv2.destroyAllWindows()
위에서 찍은 사진을 이어서 동영상으로 만듬
# 실습
import cv2
img = cv2.imread('./images/pic_1.png')
h,w,_=img.shape
fps = 1.0
codec = cv2.VideoWriter_fourcc(*'DIVX')
out = cv2.VideoWriter('sample.avi', codec,fps,(w,h))
for i in range(1, 20) :
# 저장된 이미지 불어오기
img = cv2.imread(f'./images/pic_{i}.png', cv2.IMREAD_COLOR)
out.write(img)
# 동영상 저장이 끝나면 파일 해제
out.release()
○ cv2.VideoCapture() : 비디오 캡처 (카메라, 동영상, 유튜브 등)
○ ret, frame = cap.read() : 비디오로부터 프레임 이미지를 읽어서 반환
○ cv2.VideoWriter_fourcc () : 녹화 파일을 설정하는 함수
○ out.write() : 영상을 저장
○ cv2.imwrite() : 이미지를 저장
○ 일반적인 동영상은 1초에 30장의 프레임이미지로 구성