OpenCV 기초

1. OpenCV 개요

  • OpenCV (Open Source Computer Vision Library)
    • 컴퓨터 비전 및 머신러닝 애플리케이션 개발을 위한 오픈소스 라이브러리
    • 다양한 프로그래밍 언어(C++, Python, Java 등) 지원
    • 실시간 영상 처리에 강력한 기능 제공
  • 컴퓨터 비전(Computer Vision)
    • 컴퓨터가 사람의 눈처럼 이미지나 비디오를 ‘보고’ 이해하도록 만드는 AI 분야
  • 자율주행 및 모빌리티 AI에서의 OpenCV
    • 핵심 역할
      • 자율주행차의 ‘눈’인 카메라 센서에서 들어오는 영상 데이터를 처리하고 분석하는 데 필수
    • 주요 활용 예시
      • 객체 인식: 도로 위의 차량, 보행자, 자전거 등을 탐지, 분류
      • 차선 인식: 차량이 주행할 차선의 식별 및 추적
      • 신호등 및 표지판 인식: 교통 신호와 도로 표지판의 종류를 판독하여 차량의 행동 결정
      • 거리 측정: 스테레오 비전이나 단안 카메라 기반의 기술로 객체까지의 거리 추정
      • 환경 인지: 악천후(비, 눈, 안개) 환경에서의 영상 품질 개선 및 주변 환경 정보 추출

2. OpenCV 개발 환경 설정

  • 기능 실습 시: PC / CoLab에서 실행
    • PC: 직접 패키지들을 설치해야 함
    • CoLab: 기본적으로 설치되어 있음 ➜ 직접 설치할 필요 없음
  • 구현 실습 시: Raspberry Pi에서 실행 ➜ 직접 패키지들을 설치해야 함 + 리눅스 기반
#// file: "Terminal: bash"
# 1. 시스템 업데이트
sudo apt update
sudo apt upgrade

# 2. OpenCV 설치에 필요한 패키지 설치
sudo apt install build-essential cmake pkg-config
sudo apt install libjpeg-dev libpng-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt install libgtk-3-dev libatlas-base-dev gfortran
sudo apt install python3-dev python3-pip

# 3. OpenCV 파이썬 라이브러리 설치
# (시간이 꽤 소요될 수 있음)
pip3 install opencv-python numpy matplotlib
  • 확인: 설치 후 Python에서 import cv2가 성공하면 됨

3. OpenCV를 이용한 이미지 기본 작업

3.1 이미지 불러오기

  • 지정된 경로의 이미지를 NumPy 배열 형태로 메모리에 로드
    • 사용함수: cv2.imread()
      • 경로
        • 이미지 파일의 정확한 경로를 지정
        • 예: images/my_car.jpg
      • Flags
        • cv2.IMREAD_COLOR(기본값, 컬러로 로드)
        • cv2.IMREAD_GRAYSCALE(그레이스케일로 로드) 등
#// file: "image_process.py"
import cv2

# 이미지 불러오기 (OpenCV는 BGR 순서)
# (이미지 파일 경로는 각자의 환경에 맞게)
image_path = 'images/traffic_light.jpg' 
img_color = cv2.imread(image_path, cv2.IMREAD_COLOR)

# 이미지가 제대로 로드되었는지 확인
if img_color is not None:
    print("이미지 불러오기 성공!")
    print(f"이미지 형태 (높이, 너비, 채널): {img_color.shape}") # 예: (480, 640, 3)
    print(f"이미지 데이터 타입: {img_color.dtype}") # 예: uint8

else:
    print(f"오류: {image_path} 파일을 찾을 수 없거나 불러올 수 없습니다.")

3.2 이미지 표시하기

  • 새로운 창에 이미지 표시
    • 사용함수: cv2.imshow()
      • cv2.waitKey(): 키 입력을 기다리는 함수
        • 0: 무한정 대기
        • 특정 시간(밀리초): 해당 시간 동안 대기
      • cv2.destroyAllWindows(): 생성된 모든 OpenCV 창을 닫음
#// file: "image_process.py"
if img_color is not None:
    cv2.imshow('Traffic Light Image', img_color) # 'Traffic Light Image'는 창 이름
    
    cv2.waitKey(0) # 키 입력이 있을 때까지 무한정 대기
    cv2.destroyAllWindows() # 모든 창 닫기

3.3 이미지 저장하기

  • 처리된 이미지를 파일로 저장
    • 사용함수: cv2.imwrite()
      • 확장자: 이미지 형식(png, jpg, bmp 등)은 확장자에 따라 자동으로 결정됨
#// file: "image_process.py"
# 그레이스케일 이미지로 변환 후 저장하는 예시
if img_color is not None:
    img_gray = cv2.cvtColor(img_color, cv2.COLOR_BGR2GRAY)
    cv2.imshow('Traffic Light Image', img_gray) # 변환된 이미지 확인용으로 표시해보기
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    cv2.imwrite('images/traffic_light_gray.jpg', img_gray)
    print("그레이스케일 이미지 저장 완료!")

3.4 이미지 속성 확인

  • .shape: 이미지의 형태 (높이, 너비, 채널 수)
  • .size: 전체 픽셀 수 (높이 * 너비 * 채널 수)
  • .dtype: 이미지 픽셀 데이터 타입 (일반적으로 uint8)
if img_color is not None:
    print(f"이미지 형태 (높이, 너비, 채널): {img_color.shape}")
    print(f"전체 픽셀 수: {img_color.size}")
    print(f"데이터 타입: {img_color.dtype}")