[파이썬] 컴퓨터 비전을 활용한 영상 압축 및 전송

영상 압축과 전송은 컴퓨터 비전 분야에서 중요한 주제 중 하나입니다. 영상은 큰 용량을 차지하기 때문에 압축이 필요하며, 압축된 영상은 원활한 전송을 위해 사용됩니다. 이번 블로그 포스트에서는 파이썬을 사용하여 영상 압축 및 전송을 어떻게 수행할 수 있는지 알아보겠습니다.

영상 압축

영상 압축은 영상 데이터의 용량을 줄이는 과정입니다. 이를 통해 디스크 공간을 절약하고, 전송 시간을 단축할 수 있습니다. 여러 압축 알고리즘이 있지만, 여기서는 가장 대표적인 압축 방법인 JPEG 압축을 사용하겠습니다.

import cv2

def compress_image(input_image, output_image, quality):
    image = cv2.imread(input_image)
    cv2.imwrite(output_image, image, [cv2.IMWRITE_JPEG_QUALITY, quality])

위의 코드에서는 OpenCV를 사용하여 영상을 로드한 후, cv2.imwrite 함수를 이용하여 JPEG 압축을 적용한 후에 출력 이미지로 저장합니다. quality 매개변수는 압축 품질을 결정하는 값으로, 0부터 100까지의 범위를 가집니다. 값이 작을수록 이미지의 품질이 떨어지지만 용량이 작아집니다.

영상 전송

압축된 영상을 전송하기 위해서는 네트워크를 사용해야 합니다. 파이썬에서는 socket 모듈을 사용하여 네트워크 통신을 구현할 수 있습니다. 아래의 코드는 서버에서 클라이언트로 압축된 영상을 전송하는 기본적인 예시입니다.

import socket

def send_image(image_path, host, port):
    # 이미지 파일을 바이너리 형태로 읽기
    with open(image_path, 'rb') as file:
        image_data = file.read()

    # 소켓 초기화 및 연결
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((host, port))

    # 이미지 데이터 전송
    s.sendall(image_data)

    # 소켓 종료
    s.close()

def receive_image(output_image, host, port):
    # 소켓 초기화 및 연결
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((host, port))
    s.listen(1)
    conn, addr = s.accept()

    with open(output_image, 'wb') as file:
        while True:
            # 데이터 수신
            data = conn.recv(4096)

            if not data:
                break

            # 데이터 저장
            file.write(data)

    # 소켓 종료
    conn.close()

클라이언트에서는 send_image 함수를 호출하여 압축된 영상 파일을 서버로 전송하고, 서버에서는 receive_image 함수를 호출하여 전송된 파일을 받습니다. 이를 통해 영상을 안정적으로 전송할 수 있습니다.

결론

컴퓨터 비전을 활용한 영상 압축 및 전송은 영상 처리와 컴퓨터 네트워킹을 융합한 분야입니다. 파이썬을 사용하여 영상을 압축하고 전송하는 방법을 알아보았습니다. 이를 응용하여 다양한 비디오 압축 및 전송 시스템을 구현해 볼 수 있을 것입니다.