AI 탐구노트

웹캠과 터미널로 ASCII Camera 구현하기 본문

DIY 테스트

웹캠과 터미널로 ASCII Camera 구현하기

42morrow 2024. 11. 1. 10:38

1.개요

1.1.ASCII Camera란?

ASCII Camera는 웹캠으로 촬영한 영상을 ASCII 아트로 실시간 변환하여 출력하는 프로그램입니다. 일반적으로, 웹캠으로부터 입력받은 이미지나 영상의 밝기 정보를 사용해 각 픽셀에 해당하는 ASCII 문자를 매핑하여 영상을 텍스트로 표현합니다. ASCII 아트로 변환된 결과는 CLI 환경에서도 시각적인 재미를 줄 수 있고, 이미지의 형태를 저용량 텍스트로 표현하기 때문에 네트워크 대역폭을 아낄 수 있다는 장점도 있습니다.

 

대표적인 ASCII 카메라 프로그램이나 라이브러리에는 Python의 opencv-python과 ASCII 변환을 위한 간단한 스크립트를 사용하여 구현된 예시들이 있으며, CLI에서 ASCII 카메라를 쉽게 실행할 수 있습니다. 일반적인 ASCII 카메라 구현 과정은 다음과 같습니다:

  1. 웹캠에서 영상 입력 받기: OpenCV 같은 라이브러리로 웹캠에서 프레임을 실시간으로 가져옵니다.
  2. 프레임을 회색조로 변환: ASCII 아트는 밝기 정보로 변환하기 때문에, 먼저 이미지를 회색조로 변환합니다.
  3. 밝기 정보를 기반으로 문자 매핑: 각 픽셀의 밝기 값에 따라 ASCII 문자를 선택하여 매핑합니다. 예를 들어, 밝기가 낮은 부분에는 ' ', '.', '`'와 같은 문자를, 밝기가 높은 부분에는 '#', '@'와 같은 문자를 사용하여 시각적인 깊이를 표현합니다.
  4. 프레임을 텍스트로 출력: 변환된 ASCII 문자열을 터미널에 출력하여 영상을 ASCII 아트로 실시간 표시합니다.

 

1.2. 구현해 볼 내용 

ASCII 카메라 예제들을 보면서 아쉬웠던 것은 컬러로 구현된 사례가 거의 없고, curses나 colorama라는 패키지를 이용해서 구현한 사례가 많았습니다. 그래서, 이번에는 opencv만으로 동작하는 것을 만들어 보려고 합니다. 

 

2.테스트

2.1.환경 구성

OpenCV 패키지만 있으면 됩니다. 물론 하드웨어인 웹캠과 그것으로부터 영상 입력은 정상적으로 된다는 가정이 있습니다. 

$ pip install opencv-python

 

 

2.2.테스트 코드

구현된 코드는 다음과 같이 진행됩니다. 

  • 웹캠에서 입력을 받고
  • 각 픽셀의 RGB 값을 추출하고 
  • 밝기에 따른 ASCII 문자를 선택하고
  • 해당 문자에 색상을 조합한 후
  • 화면을 구성하게 될 텍스트 프레임(출력 내용이 들어갈)에 배치하고
  • 매번 화면을 지우고 다음 프레임의 내용으로 출력합니다. 
import cv2

ascii_chars = "@%#*+=-:. "  # 밝기 값에 따라 사용할 ASCII 문자들
width = 80  # 출력할 텍스트의 폭

# RGB 값을 ANSI 이스케이프 코드로 변환하는 함수
def rgb_to_ansi(r, g, b):
    return f"\033[38;2;{r};{g};{b}m"

# 프레임을 컬러 ASCII로 변환하는 함수
def convert_to_ascii_with_color(frame):
    # 프레임을 지정된 폭으로 조정
    resized_frame = cv2.resize(frame, (width, int(width * (frame.shape[0] / frame.shape[1]) / 2)))
    ascii_image = []
    for row in resized_frame:
        ascii_row = ""
        for pixel in row:
            r, g, b = pixel  # 각 픽셀의 RGB 값
            char = ascii_chars[int(sum(pixel) / 3 / 32)]  # 밝기에 따른 ASCII 문자 선택
            ascii_row += f"{rgb_to_ansi(r, g, b)}{char}\033[0m"  # 컬러와 문자를 조합
        ascii_image.append(ascii_row)
    return "\n".join(ascii_image)

cap = cv2.VideoCapture(0)
while True:
    ret, frame = cap.read()
    if not ret:
        break
    ascii_frame = convert_to_ascii_with_color(frame)
    
    print("\033[H\033[J", end="")  # 터미널 화면 지우기
    print(ascii_frame)  # 컬러 ASCII 프레임을 출력
    cv2.waitKey(50)

cap.release()

 

2.3.실행 결과

 

테스트 결과를 화면 캡처해 봤습니다. 생각보다 간단한 코드임에도 전체적인 움직임을 파악할 수 있을 정도로 괜찮습니다. ^^

 

 

 

3.후기

 

이번 글에서는 웹캠 영상을 ASCII 캐릭터로 변환해서 터미널 상에서 볼 수 있도록 하는 것을 테스트 해 봤습니다. 사실, 웹캠이 달려 있는 상황에서 이렇게 볼 사람이 누가 있을까요? 하지만, 만약 웹캠 영상을 봐야 하는데 XWindow 같은 것을 사용할 수 없고 터미널 밖에 못 쓴다면? 흠... 일반적으로는 그럴 경우가 없겠네요. 하지만 정말 터미널 밖에 지원되지 않는 리눅스 클라이언트에서 ssh 접속을 해서 웹캠 혹은 IP 카메라 등으로부터의 영상 입력을 개략적으로나마 확인해야 하는 상황이 있을 수는 있겠죠. 

 

어찌됐건 이번 주제는 쓸모가 썩 있지는 않지만, 재미 요소는 있었던 것 같습니다. :-)

 

 


참고정보

1.Coding Challenge 166: ASCII Text Images

Javascript를 이용해 웹캠 영상을 변환하는 예시 프로그램을 만들어 보여주는 유튜브 영상입니다. 

 

 

 

그림 : 웹캠 영상을 콘솔 화면에서 ASCII로 보여주는 예시