OpenCV
OpenCV는 이미지 처리와 컴퓨터 비전을 위한 2,500개 이상의 알고리즘을 제공하는 오픈 소스 라이브러리입니다. OpenCV의 기능, 딥러닝과의 결합 방식, 코드 예제를 살펴봅니다.
OpenCV(오픈 소스 컴퓨터 비전 라이브러리)는 이미지 처리 및 컴퓨터 비전(CV)을 위한 2,500개 이상의 최적화 알고리즘을 제공하는 오픈 소스 라이브러리입니다. 이미지와 비디오를 읽고 쓰며, 카메라 스트림을 캡처하고, 픽셀을 필터링하고 변환하며, 특징을 탐지하고 매칭하고, 카메라를 보정하며, 학습된 신경망을 실행합니다. OpenCV는 1999년 Intel Research에서 시작되었으며, C++로 작성되고 Python 및 Java 바인딩을 제공하며, 버전 4.5.0부터 Apache 2.0 라이선스로 배포됩니다. Python에서는 pip install opencv-python로 설치하고 cv2로 가져오며, 모든 이미지를 NumPy 배열로 표현합니다.
OpenCV의 기능#
- 이미지 및 비디오 입출력: 일반적인 이미지 형식을 읽고 쓰며, 비디오 파일을 디코딩하고, 카메라와 네트워크 스트림에서 프레임을 캡처합니다.
- 이미지 처리: 크기 조정, 색 공간 변환, 블러 처리, 선명화, 임계값 처리, 모폴로지 연산을 제공합니다. 이는 이미지가 모델에 입력되기 전에 수행하는 표준 전처리 단계입니다.
- 특징 탐지 및 매칭: SIFT 및 ORB와 같은 코너 및 키포인트 탐지기는 파노라마 연결, 객체 위치 파악, 시각적 SLAM을 위해 이미지 간에 매칭할 수 있는 특징점을 찾습니다. SIFT는 특허 만료 후 버전 4.4.0에서 메인 라이브러리에 포함되었습니다.
- 카메라 기하학: 보정으로 렌즈 왜곡을 제거하고, 호모그래피로 원근을 보정하며, 스테레오 매칭으로 카메라 두 대에서 깊이 정보를 복원해 로보틱스와 3D 재구성에 활용합니다.
- 비디오 분석: 배경 제거로 정적인 장면에서 움직이는 객체를 분리하고, 옵티컬 플로우로 프레임 간 픽셀의 움직임을 측정합니다.
- 심층 신경망 추론:
dnn모듈은 학습된 모델을 불러옵니다. 예를 들어 ONNX 형식의 모델을 심층 학습 프레임워크를 설치하지 않고 CPU 또는 GPU에서 실행합니다.
이 고전적인 파이프라인은 학습된 모델 없이 이미지 속 형태의 윤곽을 찾습니다:
import urllib.request
import cv2
import numpy as np
# Download a sample image and decode it into a BGR NumPy array
data = urllib.request.urlopen("https://ultralytics.com/images/bus.jpg").read()
image = cv2.imdecode(np.frombuffer(data, np.uint8), cv2.IMREAD_COLOR)
# Classical pipeline: grayscale, blur to suppress noise, then Canny edge detection
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
edges = cv2.Canny(blurred, 50, 150)
# Trace connected edge pixels into contours, the outlines of shapes in the scene
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
print(f"Image shape: {image.shape}, contours found: {len(contours)}")Image shape: (1080, 810, 3), contours found: 1449을 출력합니다. 세 개의 색상 채널을 갖춘 1080×810 이미지와 에지에서 추적한 윤곽 1,449개가 표시됩니다. OpenCV는 색상 채널을 파랑-초록-빨강(BGR) 순서로 저장하므로 RGB를 기대하는 라이브러리에 이미지를 전달하기 전에 cv2.cvtColor 변환을 수행해야 합니다.
OpenCV와 딥러닝 프레임워크#
OpenCV와 PyTorch, TensorFlow와 같은 딥러닝 프레임워크는 동일한 파이프라인에서 서로 다른 단계를 담당합니다. OpenCV는 데이터 전처리와 네트워크 출력 처리를 담당해 프레임을 가져오고 크기를 조정하며 결과를 그려 출력 비디오를 저장합니다. 그 사이에서 프레임워크는 컨볼루션 신경망을 학습하고 실행합니다. 실시간 비디오 애플리케이션은 모든 프레임에서 이 단계를 반복합니다:
Ultralytics YOLO26은 OpenCV의 BGR NumPy 프레임을 직접 입력으로 받고, results[0].plot()은 동일한 형식의 주석이 추가된 프레임을 반환하므로 변환 없이 모델을 OpenCV 루프에 연결할 수 있습니다. 이 예제는 ultralytics 패키지에 포함된 샘플 이미지에 대해 루프를 한 번 실행합니다:
import cv2
from ultralytics import YOLO
from ultralytics.utils import ASSETS
# OpenCV가 번들로 제공된 샘플 이미지를 BGR NumPy 배열로 불러옵니다
frame = cv2.imread(str(ASSETS / "bus.jpg"))
# YOLO26은 OpenCV 프레임을 직접 입력으로 받습니다
model = YOLO("yolo26n.pt")
results = model(frame)
# plot()은 OpenCV에서 표시하거나 저장할 수 있는 주석이 추가된 BGR 배열을 반환합니다
annotated = results[0].plot()
cv2.imwrite("bus_annotated.jpg", annotated)비디오 루프 안에서 cv2.VideoCapture의 모든 프레임에 대해 동일한 세 호출을 실행하며, cv2.imshow 또는 cv2.VideoWriter은 cv2.imwrite를 대체합니다.










