이미지와 영상 처리의 사실상 표준 라이브러리인 OpenCV(Open Source Computer Vision Library)는 2000년 인텔 연구소에서 시작되어, 현재 전 세계 수백만 개발자가 사용하는 컴퓨터 비전의 교과서입니다. C++, Python, Java 등 다양한 언어를 지원하며, 2,500개 이상의 최적화된 알고리즘을 제공합니다.
아이젠소프트에서는 산업용 모니터링 시스템, 불량 검출, 영상 관제, 자동 계측 등 다양한 프로젝트에서 OpenCV를 핵심 엔진으로 활용하고 있습니다. 이 글에서는 OpenCV의 주요 기능과 실무 활용 사례를 단계별로 소개합니다.
OpenCV는 BSD 라이선스 기반의 오픈소스로, 상용 프로젝트에서도 자유롭게 사용 가능합니다. GPU 가속(CUDA), 크로스 플랫폼(Windows/Linux/Mac/Android/iOS), 그리고 딥러닝 프레임워크와의 원활한 통합이 핵심 강점입니다.
1. 기본 이미지 처리 — 모든 것의 시작
컴퓨터 비전의 첫걸음은 이미지를 읽고, 변환하고, 조작하는 것입니다. OpenCV는 이 기본 작업들을 매우 간결한 API로 제공합니다.
# 기본 이미지 처리 예시 — Python import cv2 import numpy as np # 이미지 읽기 img = cv2.imread('input.jpg') # 그레이스케일 변환 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 가우시안 블러 (노이즈 제거) blurred = cv2.GaussianBlur(gray, (5, 5), 0) # 이진화 (Adaptive Threshold) binary = cv2.adaptiveThreshold( blurred, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2 )
2. 경계(Edge) 검출 — 물체의 윤곽을 찾다
경계 검출은 이미지에서 밝기가 급격히 변하는 지점을 찾아 물체의 윤곽선을 추출하는 기법입니다. 제조업 불량 검출, 의료 영상 분석, 자율주행의 차선 인식 등에서 핵심적인 역할을 합니다.
주요 경계 검출 알고리즘
| 알고리즘 | 특징 | 적합한 용도 |
|---|---|---|
| Sobel | X/Y 방향 미분 기반, 방향성 경계 검출 | 방향별 경계 분석 |
| Laplacian | 2차 미분, 모든 방향 경계 동시 검출 | 빠른 전방향 검출 |
| Canny | 다단계 처리, 비최대 억제+히스테리시스 | 정밀한 경계 추출 |
| Scharr | Sobel 개선형, 3×3 커널 최적화 | 미세한 경계 검출 |
# Canny Edge Detection — 가장 널리 쓰이는 경계 검출 edges = cv2.Canny(blurred, threshold1=50, threshold2=150) # 윤곽선 찾기 contours, _ = cv2.findContours( edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE ) # 면적 기준 필터링 — 불량 부품 검출 등에 활용 for cnt in contours: area = cv2.contourArea(cnt) if area > 500: cv2.drawContours(img, [cnt], -1, (0,255,0), 2)
3. 특징점 추출 & 매칭 — 이미지 간의 연결고리
특징점(Feature Point)은 이미지에서 고유한 패턴을 가진 점들로, 이미지 매칭, 파노라마 합성, 물체 추적, AR 등에서 핵심적인 역할을 합니다.
- SIFT (Scale-Invariant Feature Transform) — 크기·회전 불변 특징점. 정확도 높지만 연산량 큼
- SURF (Speeded-Up Robust Features) — SIFT의 빠른 대안. 특허 문제로 사용 제한
- ORB (Oriented FAST and Rotated BRIEF) — 오픈소스 무료, 실시간 처리에 적합
- AKAZE — 비선형 스케일 공간, ORB보다 정확하면서도 빠름
# ORB 특징점 추출 & 매칭 orb = cv2.ORB_create(nfeatures=1000) kp1, des1 = orb.detectAndCompute(img1, None) kp2, des2 = orb.detectAndCompute(img2, None) # Brute-Force 매칭 bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) matches = bf.match(des1, des2) matches = sorted(matches, key=lambda x: x.distance) # 상위 50개 매칭 시각화 result = cv2.drawMatches(img1, kp1, img2, kp2, matches[:50], None)
4. DNN 모듈 — 딥러닝과의 만남
OpenCV 3.3부터 도입된 DNN(Deep Neural Network) 모듈은 별도의 딥러닝 프레임워크 없이도 학습된 모델을 로드하여 추론(Inference)할 수 있게 해줍니다. 학습은 TensorFlow나 PyTorch에서 하고, 배포(Inference)는 OpenCV DNN으로 — 이것이 실무에서 가장 많이 쓰이는 패턴입니다.
지원하는 모델 포맷
- ONNX — 범용 딥러닝 교환 포맷 (PyTorch, TensorFlow 등에서 변환)
- TensorFlow — .pb (Frozen Graph) / SavedModel
- Caffe — .prototxt + .caffemodel
- Darknet — .cfg + .weights (YOLO 시리즈)
- Torch — .t7 모델
# YOLO 객체 탐지 — OpenCV DNN net = cv2.dnn.readNetFromDarknet('yolov4.cfg', 'yolov4.weights') net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA) net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA) # 이미지 → Blob 변환 blob = cv2.dnn.blobFromImage( img, 1/255.0, (416, 416), swapRB=True, crop=False ) net.setInput(blob) # 추론 실행 outputs = net.forward(net.getUnconnectedOutLayersNames())
5. 실시간 영상 처리 — 카메라에서 분석까지
OpenCV의 VideoCapture 클래스는 웹캠, IP 카메라(RTSP), 동영상 파일 등 다양한 소스에서 프레임을 실시간으로 캡처할 수 있습니다. 산업 현장에서는 이를 활용해 실시간 품질 검사, CCTV 관제, 동작 감지 시스템을 구축합니다.
# 실시간 카메라 영상 처리 루프 cap = cv2.VideoCapture(0) # 웹캠 # cap = cv2.VideoCapture('rtsp://192.168.0.10:554/stream') while cap.isOpened(): ret, frame = cap.read() if not ret: break # 프레임 전처리 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) edges = cv2.Canny(gray, 50, 150) # 결과 표시 cv2.imshow('Live Edge Detection', edges) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release()
RTSP/USB
VideoCapture
전처리+분석
이벤트 발생
실시간 표시
6. 아이젠소프트의 OpenCV 활용 사례
아이젠소프트에서 실제 납품한 프로젝트에서 OpenCV가 어떻게 활용되었는지 소개합니다.