OpenCV
OpenCV — библиотека с открытым исходным кодом, содержащая более 2 500 алгоритмов для обработки изображений и компьютерного зрения. Что она делает, как сочетается с глубоким обучением, примеры кода.
OpenCV (библиотека компьютерного зрения с открытым исходным кодом) — это библиотека с открытым исходным кодом, включающая более 2 500 оптимизированных алгоритмов для обработки изображений и компьютерного зрения (CV). Она читает и записывает изображения и видео, захватывает потоки с камер, фильтрует и преобразует пиксели, обнаруживает и сопоставляет признаки, калибрует камеры и запускает обученные нейронные сети. OpenCV появилась в Intel Research в 1999 году. Она написана на 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 принимает кадры NumPy в формате BGR из OpenCV напрямую, а results[0].plot() возвращает кадр с аннотациями в том же формате. Поэтому модель можно встроить в цикл OpenCV без преобразований. Этот пример выполняет один проход такого цикла на тестовом изображении из пакета ultralytics:
import cv2
from ultralytics import YOLO
from ultralytics.utils import ASSETS
# OpenCV загружает встроенное тестовое изображение как массив NumPy в формате BGR
frame = cv2.imread(str(ASSETS / "bus.jpg"))
# YOLO26 принимает кадр OpenCV напрямую
model = YOLO("yolo26n.pt")
results = model(frame)
# plot() возвращает массив BGR с аннотациями, который OpenCV может отображать или сохранять
annotated = results[0].plot()
cv2.imwrite("bus_annotated.jpg", annotated)Внутри цикла обработки видео те же три вызова выполняются для каждого кадра из cv2.VideoCapture, а cv2.imshow или cv2.VideoWriter заменяет cv2.imwrite.










