안녕하세요. 코딩산책입니다.
이 글은 OpenCV를 사용하여 이미지, 비디오, 웹캠, 그리고 RTSP/RTMP 같은 스트리밍 URL을 처리하는 방법을 설명합니다. 이미지 파일을 읽고 화면에 출력하는 기본적인 코드부터 비디오 파일을 프레임 단위로 처리하는 방법, 웹캠을 사용해 실시간 영상을 출력하는 방법을 다룹니다. 또한, RTSP 및 RTMP와 같은 스트리밍 프로토콜을 이용한 실시간 스트리밍 처리 방법과, cv2.VideoCapture 객체의 다양한 속성을 set(...) 함수를 통해 제어하는 방법을 표로 정리하여 제공합니다. 이를 통해 OpenCV로 이미지 및 영상 데이터를 처리하는 기본적인 기술을 익힐 수 있습니다.
1. 이미지 읽기 및 저장
우선 이미지 파일을 읽고 화면에 표시하고 저장하는 방법을 설명합니다. OpenCV의 cv2.imread 함수를 사용하여 이미지를 읽고, flag에 따라서 이미지를 Color(defualt), Grayscale, or alpha channel을 포함한 Unchanged 모드로 나누어 읽어 들일 수 있습니다. cv2.imshow 함수를 사용해 이를 화면에 표시할 수 있고, cv2.imwrite 함수를 사용해서 이미지를 저장할 수 있습니다.
import cv2
# load image
img = cv2.imread('resources/Lena.png', cv2.IMREAD_COLOR)
# show image
cv2.imshow('Output', img)
# save image
cv2.imwrite('output_image.png', img)
# keep screen on (0 means infinite wait)
cv2.waitKey(0)
# close the window
cv2.destroyAllWindows()
- imread : 파일 경로에서 이미지를 불러옴.
- imshow : 창 이름과 함께 이미지를 표시함.
- waitKey : 키 입력을 대기하며, 0이면 무한 대기.
2. 비디오 파일 읽기 및 저장
비디오 파일을 읽고 이를 한 프레임씩 출력하고 저장하는 방법입니다. cv2.VideoCapture 객체를 사용하여 비디오 파일을 불러오고, while 반복문을 사용하여 프레임을 처리합니다. 비디오 파일을 저장하려면 cv2.VideoWriter 객체를 사용하여 저장할 비디오 파일의 형식과 코덱을 지정할 수 있습니다. 비디오 파일은 프레임 단위로 저장됩니다.
import cv2
# load video
cap = cv2.VideoCapture('resources/TownCentreXVID.mp4')
# video save settings
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output_video.avi', fourcc, 20.0, (640, 480))
while True:
# reading the frame
success, img = cap.read()
# check if the frame was read successfully
if not success:
break
# show frame
cv2.imshow('Video', img)
# save frame
out.write(img)
# end loop when 'q' key is pressed
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# release the video object and close the window
cap.release()
out.release()
cv2.destroyAllWindows()
- VideoCapture: 비디오 파일을 불러오고 읽는 객체.
- VideoWriter : 비디오 파일을 저장하는 객체. (파일명, 코덱, FPS, 이미지 사이즈를 지정할 수 있다.)
- VideoWriter_fourcc : 코덱 설정하는 객체.
- read : 비디오에서 프레임을 하나씩 읽음.
- write : 프레임을 비디오에 하나씩 저장.
- waitKey(1) : 1ms 대기 후 다음 프레임을 표시.
3. 웹캠 사용 및 저장
웹캠을 사용하는 방식은 비디오 파일을 처리하는 방법과 거의 동일합니다. cv2.VideoCapture에 파일 경로 대신 카메라 ID를 지정하여 사용합니다. 일반적으로 카메라 ID는 0이며, 해상도도 설정할 수 있습니다.
import cv2
# load webcam (ID 0)
cap = cv2.VideoCapture(0)
# video save settings
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('webcam_output.avi', fourcc, 20.0, (640, 480))
# set resolution
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) # width
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) # height
while True:
# read frame
success, img = cap.read()
# show frame
cv2.imshow('Webcam', img)
# save frame
out.write(img)
# end loop when 'q' key is pressed
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# disable webcam and video and close window
cap.release()
out.release()
cv2.destroyAllWindows()
- set(cv2.CAP_PROP_FRAME_WIDTH, 640) : 너비를 640으로 설정.
- set(cv2.CAP_PROP_FRAME_HEIGHT, 480) : 높이를 480으로 설정.
밝기 조절
웹캠의 밝기 설정은 set(cv2.CAP_PROP_BRIGHTNESS, "값")을 사용합니다. 예를 들어, 밝기를 100으로 설정하려면 다음과 같이 코드를 작성할 수 있습니다.
cap.set(cv2.CAP_PROP_BRIGHTNESS, 100) # 밝기 설정
4. RTSP / RTMP 스트리밍 사용
RTSP 및 RTMP는 실시간 영상 스트리밍을 위한 프로토콜입니다. OpenCV에서 이 스트리밍을 처리하기 위해서는 스트리밍 URL을 cv2.VideoCapture()에 전달하여 실시간으로 데이터를 가져올 수 있습니다. RTSP는 보통 IP 카메라에서 사용되고, RTMP는 라이브 방송 같은 스트리밍 서비스에서 주로 사용됩니다. IP 카메라가 없는 경우, 웹캠을 사용해 RTSP 송출이 가능하도록 하는 방법을 아래의 링크에서 확인 가능합니다.
2024.09.24 - [개발환경/미분류] - 웹캠으로 RTSP 송출하고 MediaMTX로 스트림 서버 구성하는 방법
import cv2
# load RTSP streams
rtsp_url = 'rtsp://username:password@ip_address:port/stream'
cap = cv2.VideoCapture(rtsp_url)
# video save settings
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('rtsp_output.avi', fourcc, 20.0, (640, 480))
while True:
success, frame = cap.read()
if not success:
break
# streaming output
cv2.imshow('Streaming', frame)
# save frame
out.write(frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# end stream save
cap.release()
out.release()
cv2.destroyAllWindows()
- rtsp : 영상 스트리밍 프로토콜.
- username : RTSP 카메라의 유저 이름.
- password : RTSP 카메라의 비밀번호.
- ip_address : RTSP 카메라의 IP Address.
- port : RTSP 카메라의 port (보통적으로 554 사용).
- stream : RTSP 카메라의 스트림 경로.
이 글에서는 OpenCV를 사용하여 이미지, 비디오 파일, 웹캠, 그리고 RTSP/RTMP 스트림을 처리하고 저장하는 방법을 살펴보았습니다. 이미지와 비디오 파일을 읽어 화면에 출력하고, 필요한 경우 이를 파일로 저장하는 방법을 간단한 코드 예시로 설명했습니다. 또한, 실시간 웹캠 영상을 처리하고, 이를 저장하는 방법도 동일하게 적용할 수 있음을 보여주었으며, RTSP 및 RTMP 스트리밍 URL을 활용한 실시간 영상 처리 방법도 함께 다루었습니다.
마지막으로, cv2.VideoCapture 객체의 다양한 속성을 cap.set() 함수를 통해 제어할 수 있는 방법을 아래와 같이 표로 정리하여 제공하며, 필요한 설정을 적용하여 더 효율적으로 영상을 처리할 수 있습니다. 이 모든 과정을 통해 OpenCV를 활용한 영상 처리의 기본기를 확립할 수 있으며, 이를 바탕으로 다양한 응용 프로그램에 적용할 수 있을 것입니다.
영상 처리에서 중요한 것은 실시간성과 정확성입니다. 이 글을 바탕으로 영상 데이터를 자유롭게 처리하고, 필요한 경우 저장하며, 영상 처리를 더 심화시킬 수 있기를 바랍니다.
해당 포스트가 유용하셨다면 하단의 좋아요와 구독하기 부탁드립니다. ^^
부록. set(...) 속성값
속성번호 | 속성이름 | 설명 |
0 | cv2.CAP_PROP_POS_MSEC | 현재 프레임의 시간 위치 (밀리초) |
1 | cv2.CAP_PROP_POS_FRAME | 현재 프레임 번호 |
2 | cv2.CAP_PROP_POS_AVI_RATIO | 비디오 파일에서 상대적인 위치 (0: 시작, 1: 끝) |
3 | cv2.CAP_PROP_FRAME_WIDTH | 프레임의 너비 |
4 | cv2.CAP_PROP_FRAME_HEIGHT | 프레임의 높이 |
5 | cv2.CAP_PROP_FPS | 초당 프레임 수 (FPS) |
6 | cv2.CAP_PROP_FOURCC | 비디오 코덱 설정 |
7 | cv2.CAP_PROP_FRAME_COUNT | 전체 프레임 수 (읽기 전용) |
8 | cv2.CAP_PROP_FORMAT | 픽셀 형식 설정 |
9 | cv2.CAP_PROP_MODE | 카메라 모드 설정 |
10 | cv2.CAP_PROP_BRIGHTNESS | 밝기 설정 |
11 | cv2.CAP_PROP_CONTRAST | 대비 설정 |
12 | cv2.CAP_PROP_SATURATION | 채도 설정 |
13 | cv2.CAP_PROP_HUE | 색조 설정 |
14 | cv2.CAP_PROP_GAIN | 게인 설정 |
15 | cv2.CAP_PROP_EXPOSURE | 노출 시간 설정 |
16 | cv2.CAP_PROP_CONVERT_RGB | RGB 변환 활성화 여부 |
17 | cv2.CAP_PROP_WHITE_BALANCE_BLUE_U | 화이트 밸런스 설정 (파란색 톤) |
18 | cv2.CAP_PROP_RECTIFICATION | 직선화 설정 (입체 카메라에 사용) |
19 | cv2.CAP_PROP_MONOCHROME | 모노크롬 설정 (흑백) |
20 | cv2.CAP_PROP_SHARPNESS | 선명도 설정 |
21 | cv2.CAP_PROP_AUTO_EXPOSURE | 자동 노출 설정 (0: 수동, 1: 자동) |
22 | cv2.CAP_PROP_GAMMA | 감마 설정 |
23 | cv2.CAP_PROP_TEMPERATURE | 색온도 설정 |
24 | cv2.CAP_PROP_TRIGGER | 트리거 설정 (특정 카메라에 따라 다름) |
25 | cv2.CAP_PROP_TRIGGER_DELAY | 트리거 지연 설정 |
26 | cv2.CAP_PROP_WHITE_BALANCE_RED_V | 화이트 밸런스 설정 (붉은색 톤) |
27 | cv2.CAP_PROP_ZOOM | 줌 설정 |
28 | cv2.CAP_PROP_FOCUS | 포커스 설정 |
29 | cv2.CAP_PROP_GUID | 카메라 GUID 설정 |
30 | cv2.CAP_PROP_ISO_SPEED | ISO 속도 설정 |
32 | cv2.CAP_PROP_BACKLIGHT | 백라이트 보정 설정 |
33 | cv2.CAP_PROP_PAN | 팬(pan) 설정 |
34 | cv2.CAP_PROP_TILT | 틸트(tilt) 설정 |
35 | cv2.CAP_PROP_ROLL | 롤(roll) 설정 |
36 | cv2.CAP_PROP_IRIS | 조리개(iris) 설정 |
37 | cv2.CAP_PROP_SETTINGS | 카메라 설정 대화 상자 열기 |
38 | cv2.CAP_PROP_BUFFERSIZE | 내부 버퍼 크기 설정 |
★ 모든 내용은 아래의 링크를 참조하였습니다. ★
'강의 (Lecture) > OpenCV 마스터 with Python (초급)' 카테고리의 다른 글
OpenCV + Python 각도 측정기 (실습) (3) | 2024.09.30 |
---|---|
OpenCV + Python 한글 폰트 출력하기 (2) | 2024.09.30 |
OpenCV + Python 마우스 및 키보드 이벤트 처리와 트랙바 활용하기 (0) | 2024.09.28 |
OpenCV + Python 다양한 그리기 함수 및 문자 출력 (1) | 2024.09.25 |
OpenCV + Python 과정 소개 및 설치 과정 (1) | 2024.09.08 |