본문 바로가기
강의 (Lecture)/OpenCV 마스터 with Python (초급)

OpenCV + Python 이미지, 비디오, 웹캠(Webcam), RTSP 및 RTMP 스트림 처리

by codingwalks 2024. 9. 24.
728x90
반응형

안녕하세요. 코딩산책입니다.

이 글은 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를 활용한 영상 처리의 기본기를 확립할 수 있으며, 이를 바탕으로 다양한 응용 프로그램에 적용할 수 있을 것입니다.
영상 처리에서 중요한 것은 실시간성정확성입니다. 이 글을 바탕으로 영상 데이터를 자유롭게 처리하고, 필요한 경우 저장하며, 영상 처리를 더 심화시킬 수 있기를 바랍니다.
 

Youtube

 

해당 포스트가 유용하셨다면 하단의 좋아요와 구독하기 부탁드립니다. ^^

Buy me a coffee

 

[Codingwalks]에게 송금하기 - AQR

[Codingwalks]에게 송금하기 - AQR

aq.gy


부록. 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 내부 버퍼 크기 설정

★ 모든 내용은 아래의 링크를 참조하였습니다. ★

 

OpenCV: OpenCV-Python Tutorials

Core Operations In this section you will learn basic operations on image like pixel editing, geometric transformations, code optimization, some mathematical tools etc.

docs.opencv.org

 

728x90
반응형