Skip to main content

Command Palette

Search for a command to run...

2. OpenCV-Python 환경 설정 및 기초

Updated
•4 min read•View as Markdown
U
Keep learning toward wellbeing life with co-livers

목차


2.1 OpenCV란?

Open Source Computer Vision Library Intel이 개발하고 오픈소스로 공개된 컴퓨터 비전 및 영상처리 라이브러리

graph LR
    A["OpenCV"] --> B["영상 처리\n(Image Processing)"]
    A --> C["컴퓨터 비전\n(Computer Vision)"]
    A --> D["머신 러닝\n(Machine Learning)"]
    A --> E["딥 러닝\n(Deep Learning)"]

    style A fill:#4a90d9,color:#fff
항목 내용
최초 배포 2000년 (Intel)
언어 지원 C++, Python, Java, MATLAB
주요 모듈 core, imgproc, highgui, video, ml, dnn
라이선스 Apache 2.0 (상업적 이용 가능)

2.2 환경 설치

설치 방법

# 가상환경 생성 (권장)
python -m venv .venv
source .venv/bin/activate  # macOS/Linux
.venv\Scripts\activate     # Windows

# OpenCV 설치
pip install opencv-python       # 기본 패키지 (highgui 포함)
pip install opencv-python-headless  # 서버 환경 (GUI 없음)

# 필수 의존 패키지
pip install numpy

설치 확인

import cv2
import numpy as np

print(f"OpenCV 버전: {cv2.__version__}")
print(f"NumPy 버전: {np.__version__}")

2.3 OpenCV 기본 구조

graph TD
    OCV["OpenCV (cv2)"]
    OCV --> CORE["core\n핵심 자료구조 및 기본 연산"]
    OCV --> IMGPROC["imgproc\n영상 처리 (필터, 변환 등)"]
    OCV --> HIGHGUI["highgui\n윈도우, 이벤트, I/O"]
    OCV --> VIDEO["video\n영상/영화 처리"]
    OCV --> ML["ml\n머신러닝 알고리즘"]
    OCV --> DNN["dnn\n딥러닝 추론"]

    HIGHGUI --> H1["imshow() - 영상 출력"]
    HIGHGUI --> H2["imread() - 영상 읽기"]
    HIGHGUI --> H3["imwrite() - 영상 저장"]
    HIGHGUI --> H4["waitKey() - 키 입력 대기"]

OpenCV 좌표 시스템

(0,0) ──────────────→ x축 (열, col)
  │  ┌─────────────────┐
  │  │                 │
  │  │   영상(Image)   │
  │  │                 │
  ↓  └─────────────────┘
 y축
(행, row)

OpenCV에서 좌표는 (x, y) = (열, 행) 순서이지만, NumPy 배열은 (row, col) = (행, 열) 순서임에 주의!


2.4 기본 사용법

영상 읽기 / 출력 / 저장

import cv2

# 영상 읽기
img = cv2.imread('image.jpg')           # 컬러 (BGR)
img_gray = cv2.imread('image.jpg', 0)   # 그레이스케일
img_alpha = cv2.imread('image.png', -1) # 알파 채널 포함

# 영상 출력 (윈도우)
cv2.imshow('Window Title', img)
cv2.waitKey(0)          # 0: 키 입력 무한 대기, n: n ms 대기
cv2.destroyAllWindows() # 모든 윈도우 닫기

# 영상 저장
cv2.imwrite('output.jpg', img)

imread() 플래그

플래그 값 설명
cv2.IMREAD_COLOR 1 (기본값) 컬러 BGR로 읽기
cv2.IMREAD_GRAYSCALE 0 그레이스케일로 읽기
cv2.IMREAD_UNCHANGED -1 원본 그대로 (알파 포함)

OpenCV 기본 영상 프로그램 패턴

flowchart TD
    A["프로그램 시작"] --> B["cv2.imread() / np.zeros()\n영상 생성 또는 읽기"]
    B --> C["영상 처리\n알고리즘 적용"]
    C --> D["cv2.imshow()\n영상 출력"]
    D --> E["cv2.waitKey()\n키 입력 대기"]
    E --> F{종료 키?}
    F -- "Yes (예: 'q' 또는 ESC)" --> G["cv2.destroyAllWindows()\n종료"]
    F -- "No" --> C

Hello OpenCV (02.opencvtest.py 기반)

import numpy as np
import cv2

# 검은 배경 영상 생성 (300행 × 400열, uint8 타입)
image = np.zeros((300, 400), np.uint8)
image.fill(200)  # 밝기값 200으로 채우기 (밝은 회색)

cv2.imshow("Window title", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.5 NumPy와 OpenCV

OpenCV의 영상 데이터는 내부적으로 NumPy ndarray로 표현된다.

영상과 NumPy 배열의 관계

graph LR
    IMG["영상 (Image)"] -- "cv2.imread()" --> ARR["NumPy ndarray"]
    ARR -- "cv2.imshow()" --> IMG

    ARR --> SHAPE["shape: (행, 열, 채널)"]
    ARR --> DTYPE["dtype: uint8 (0~255)"]

주요 속성 확인

import cv2

img = cv2.imread('image.jpg')

print(img.shape)   # (height, width, channels) → 예: (480, 640, 3)
print(img.dtype)   # uint8
print(img.size)    # 전체 원소 수 = height × width × channels

그레이스케일 vs 컬러

구분 shape dtype 채널
그레이스케일 (H, W) uint8 1 (밝기)
컬러 (BGR) (H, W, 3) uint8 3 (Blue, Green, Red)
알파 포함 (H, W, 4) uint8 4 (BGR + Alpha)

OpenCV는 RGB가 아닌 BGR 순서로 채널을 저장한다!

자주 사용하는 NumPy 영상 생성

import numpy as np

# 검은 영상 (300 × 400, 그레이스케일)
black = np.zeros((300, 400), np.uint8)

# 흰 영상 (300 × 400, 컬러)
white = np.ones((300, 400, 3), np.uint8) * 255

# 특정 밝기값으로 채운 영상
gray = np.full((300, 400), 128, np.uint8)

핵심 함수 정리

함수 용도 주요 인수
cv2.imread(path, flag) 영상 파일 읽기 path, flag (0/1/-1)
cv2.imshow(winname, img) 윈도우에 영상 출력 윈도우 이름, ndarray
cv2.imwrite(path, img) 영상 파일 저장 저장 경로, ndarray
cv2.waitKey(delay) 키 입력 대기 delay(ms), 0=무한
cv2.destroyAllWindows() 모든 윈도우 닫기 —

More from this blog

카메라 영상 $\rarr$ 유속 추정(A to Z) 프로젝트 소개

프로젝트 목적 말 그대로 카메라 영상에서 하천 흐름의 유속값과 유속의 분포 데이터를 안정적으로 추정하기 위한 파이프 라인을 설계하기 위해 제로 베이스에서 시작해서 이해도를 높여보기 위한 프로젝트 수식에 대한 이해와 함께 opencv, python 기반으로 실제 구현 코드를 작성해보고 및 소스코드의 현장 적용성도 함께 검토하고자 한다. 프로젝트 수행 방법 기존에 사용하고 있는 태블릿의 코틀린 코드와 UI를 최대한 그대로 사용하고자 하며, 1...

May 1, 20265 min read2

print(obj.__secret) # 오류 발생! (직접 접근 불가)

객체 지향 프로그래밍 클래스와 인스턴스 클래스 메서드들은 중첩된 def이며, 특수한 첫번째 인자는 묵시적으로 대상 인스턴스를 받는다. 네, 정확합니다! self를 설명하는 내용이 맞습니다. 이 문장을 조금 더 자세히 풀어드리면 다음과 같습니다. 1. "클래스 메서드들은 중첩된 def이며" 파이썬에서 클래스 내부의 함수(메서드)는 클래스라는 '객체 내부'에 정의되어 있습니다. def는 함수를 만드는 키워드인데, 클래스라는 범위(scope) ...

Apr 28, 20264 min read2

9장 함수(Python)

9.3 인수와 매개변수 자바와 동일하게? 함수 외부에서는 인수라고 하지만 내부에서는 매개변수라고 한다. 함수로 전달한 값을 인수라고 부른다. 인수의 값은 함수 내에서 해당하는 매개변수에 복사된다. 함수가 명시적으로 return 을 호출하지 않으면, 호출자는 반환값으로 None을 얻는다. 9.3.1 유용한 None None은 아무것도 없다는 것을 뜻하는 파이썬의 특별한 값이다. 빠뜨린 빈 값을 구분하기 위해 None을 사용한다. 불리언 값 ...

Apr 20, 202613 min read

[ITSantiago]의 개발 블로그 | TIL & Tech Log

36 posts