OpenCV 이미지 및 동영상 읽기[OpenCV]
이미지 읽기
OpenCV를 사용해서 이미지를 화면에 표시
# 이미지 파일_화면 표시
import cv2
img_file = "../img/img1.jpg" # 이미지 경로
img = cv2.imread(img_file) # 이미지 읽어서 img 변수에 할당
if img is not None:
cv2.imshow('IMG', img) # 읽은 이미지를 화면에 표시
cv2.waitKey() # 키 입력될 때 까지 대기
cv2.destroyAllWindows() # 창 닫기
else:
print('No image file.')
cv2.imread() 함수로 이미지를 읽어 온다
img = cv2.imread(img_file) # 이미지 읽어서 img 변수에 할당
cv2.imshow() 함수는 읽어 온 이미지를 화면에 표시한다
cv2.imshow('IMG', img) # 읽은 이미지를 화면에 표시
cv2.imread()
- 파라미터로 cv2.IMREAD_GRAYSCALE을 전달하면 흑백 이미지로 불러옵니다
- cv2.imread(path, flag)
- path: 이미지 파일 경로
- flag: 이미지를 어떻게 읽을지 방식 설정
- - cv2.IMREAD_COLOR(기본값): 색깔 이미지로 불러옵니다. (이때 투명도(alpha값)는 무시)
- - cv2.IMREAD_GRAYSCALE: 이미지를 흑백톤으로 불러옴
- - cv2.IMREAD_UNCHANGED: 투명도(alpha값)를 포함해 이미지를 그대로 불러옴
# 이미지 파일_화면 표시
import cv2
img_file = "../img/img1.jpg"
img = cv2.imread(img_file, cv2.IMREAD_GRAYSCALE) # 회색으로 읽기
if img is not None:
cv2.imshow('IMG', img)
cv2.waitKey()
cv2.destroyAllWindows()
else:
print('No image file.')
이미지 저장하기
cv2.imread() 함수를 호출하면 읽은 사진 파일이 img라는 변수에 담기며
cv2.imwrite() 함수를 호출하면 img 변수에 담긴 사진 파일을 자신의 PC에 저장가능하다.
# 이미지 저장하기
import cv2
img_file = '../img/img1.jpg'
save_file = '../img/img1-1.jpg'
img = cv2.imread(img_file, cv2.IMREAD_GRAYSCALE)
cv2.imshow(img_file, img)
cv2.imwrite(save_file, img) #파일로 저장, 포맷은 확장에 따름
cv2.waitKey()
cv2.destroyAllWindows()
img 디렉토리에 img1-1.jpg라는 회색 사진이 생성된다
동영상 파일 읽기
# 동영상 파일 읽기 (video_play.py)
import cv2
video_file = "../img/big_buck.avi" # 동영상 파일 경로
cap = cv2.VideoCapture(video_file) # 동영상 캡쳐 객체 생성
if cap.isOpened(): # 캡쳐 객체 초기화 확인
while True:
ret, img = cap.read() # 다음 프레임 읽기
if ret: # 프레임 읽기 정상
cv2.imshow(video_file, img) # 화면에 표시
cv2.waitKey(25) # 25ms 지연(40fps로 가정)
else: # 다음 프레임 읽을 수 없슴,
break # 재생 완료
else:
print("can't open video.") # 캡쳐 객체 초기화 실패
cap.release() # 캡쳐 자원 반납
cv2.destroyAllWindows()
cv2.VideoCapture(video_file)을 통해 동영상 파일인 video_file의 첫 프레임 읽어 캡처 객체 cap에 저장
(**동영상의 첫 프레임만 담기게된다)
초기화가 잘 되었다면 True를 반환하고, 그렇지 않으면 False를 반환
연속해서 파일의 프레임을 읽어오기 위해 무한루프로 cap.read()를 호출
imshow의 첫 번째 인자인 video_file은 화면에 나타나는 창의 제목이고, 두 번째 인자인 img는 화면에 표시할 프레임 이미지 객체
웹캠 프레임 읽기
# 카메라(웹캠) 프레임 읽기
import cv2
cap = cv2.VideoCapture(0) # 0번 카메라 장치 연결
if cap.isOpened(): # 캡쳐 객체 연결 확인
while True:
ret, img = cap.read() # 다음 프레임 읽기
if ret:
cv2.imshow('camera', img) # 다음 프레임 이미지 표시
if cv2.waitKey(1) != -1: # 1ms 동안 키 입력 대기 ---②
break # 아무 키라도 입력이 있으면 중지
else:
print('no frame')
break
else:
print("can't open camera.")
cap.release() # 자원 반납
cv2.destroyAllWindows()
v2.VideoCapture()은 인자로 동영상 파일 경로를 입력할 수도 있지만 카메라 장치 번호를 입력[웹캠이 하나밖에 없다면 인자로 0]
cv.waitKey(1) != -1 코드에서 사용자가 아무 키나 누르면 break가 되어 루프를 빠져나옴
웹캠으로 사진 찍기
# 웹캠으로 사진찍기
import cv2
cap = cv2.VideoCapture(0) # 0번 카메라 연결
if cap.isOpened() :
while True:
ret, frame = cap.read() # 카메라 프레임 읽기
if ret:
cv2.imshow('camera',frame) # 프레임 화면에 표시
if cv2.waitKey(1) != -1: # 아무 키나 누르면
cv2.imwrite('photo.jpg', frame) # 프레임을 'photo.jpg'에 저장
break
else:
print('no frame!')
break
else:
print('no camera!')
cap.release()
cv2.destroyAllWindows()
cv2.imwrite() 함수를 활용하여 특정 프레임을 저장
웹캠으로 녹화하기
# 웹캠으로 녹화하기
import cv2
cap = cv2.VideoCapture(0) # 0번 카메라 연결
if cap.isOpened:
file_path = './rec.avi' # 저장할 파일 경로 이름
fps = 30.0 # FPS, 초당 프레임 수
fourcc = cv2.VideoWriter_fourcc(*'DIVX') # 인코딩 포맷 문자
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
size = (int(width), int(height)) # 프레임 크기
out = cv2.VideoWriter(file_path, fourcc, fps, size) # VideoWriter 객체 생성
while True:
ret, frame = cap.read()
if ret:
cv2.imshow('camera-recording',frame)
out.write(frame) # 파일 저장
if cv2.waitKey(int(1000/fps)) != -1:
break
else:
print("no frame!")
break
out.release() # 파일 닫기
else:
print("can't open camera!")
cap.release()
cv2.destroyAllWindows()
cv2.VideoWriter() 함수를 사용하여 여러 프레임을 동영상으로 저장
cv2.VideoWriter(file_path, fourcc, fps, (width, height))
- file_path는 동영상 파일을 저장할 경로
- fourcc는 동영상 인코딩 형식(codec 정보)
- fps는 초당 저장될 프레임 수
- (width, height)는 프레임의 너비와 높이
cap.get()은 동영상이나 카메라의 속성을 확인하는 함수
cv2.CAP_PROP_FRAME_WIDTH는 프레임 너비
cv2.CAP_PROP_FRAME_HEIGHT는 프레임 높이를 뜻
cap.get(cv2.CAP_PROP_FRAME_WIDTH)은 cap 객체의 프레임 너비를 반환
FPS(Frames Per Second)는 초당 프레임 수를 뜻하며 지연 시간은 FPS를 활용하여 구할 수 있음
1000으로 계산하는 이유는 1초(1s)가 1,000밀리 초(1,000ms)이기 때문
코드에서 지연 시간을 cv2.waitKey(int(1000/fps))로 설정
** 실행한 뒤 아무 키나 누르면 키를 누르기 전까지 모든 프레임이 rec.avi라는 동영상으로 저장
사진: Unsplash의Ben Kolde
'OpenCV[Computer Vision]' 카테고리의 다른 글
OpenCV 한국어 인식을 위한 kor.traineddata설치_MAC[OpenCV] (1) | 2024.02.15 |
---|---|
OpenCV 사용[Open Source Computer Vision] (0) | 2024.01.17 |
Open CV Face Recognition/얼굴 인식[PYTHON 개발] (1) | 2023.12.27 |