OpenCVJuniorTechnical

Что такое OpenCV и каковы его основные области применения?

OpenCV — библиотека компьютерного зрения с более чем 2500 алгоритмами для обработки изображений, видео, детекции объектов, калибровки камер и интеграции с DNN-моделями.

Что такое OpenCV

OpenCV (Open Source Computer Vision Library) — это библиотека компьютерного зрения с открытым исходным кодом, написанная на C++ с привязками для Python, Java и других языков. Библиотека содержит более 2500 оптимизированных алгоритмов обработки изображений и машинного зрения. Разработана при поддержке Intel, сейчас поддерживается сообществом и компанией OpenCV.org. Версия 4.x — актуальная стабильная линейка.

Основные области применения

  • Обнаружение и распознавание объектов — Haar cascades, HOG+SVM, интеграция с DNN-моделями (YOLO, MobileNet).
  • Обработка видеопотоков — захват кадров с камеры или файла, фильтрация, трекинг объектов.
  • Морфологические операции — эрозия, дилатация, открытие/закрытие для бинарных масок.
  • Калибровка камер — устранение дисторсии, стереозрение, оценка позы.
  • Оптический поток — анализ движения между кадрами (Lucas-Kanade, Farneback).
  • Сегментация — GrabCut, watershed, пороговая бинаризация.
  • Распознавание лиц и жестов — обнаружение ключевых точек, landmark detection.
  • Медицинская визуализация — анализ рентгеновских снимков, МРТ.
  • Промышленный контроль качества — поиск дефектов на конвейере.
  • Дополненная реальность — наложение 3D-объектов с помощью solvePnP.

Базовый пример: чтение изображения и детекция краёв

import cv2
import numpy as np

# Загрузка изображения
image = cv2.imread("photo.jpg")
if image is None:
    raise FileNotFoundError("Изображение не найдено")

# Перевод в оттенки серого
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Размытие для снижения шума
blurred = cv2.GaussianBlur(gray, (5, 5), 0)

# Детекция краёв алгоритмом Canny
edges = cv2.Canny(blurred, threshold1=50, threshold2=150)

# Нахождение контуров
contours, hierarchy = cv2.findContours(
    edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE
)

print(f"Найдено контуров: {len(contours)}")

# Отрисовка контуров на исходном изображении
result = image.copy()
cv2.drawContours(result, contours, -1, (0, 255, 0), 2)

cv2.imwrite("result.jpg", result)

Пример: захват видео с камеры

import cv2

cap = cv2.VideoCapture(0)  # 0 — первая веб-камера
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
cap.set(cv2.CAP_PROP_FPS, 30)

while True:
    ret, frame = cap.read()
    if not ret:
        break

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    cv2.imshow("Camera", gray)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

Установка

# Базовая версия
pip install opencv-python

# Полная версия с дополнительными модулями (contrib)
pip install opencv-contrib-python

# Для headless-серверов без GUI
pip install opencv-python-headless

Подводные камни

  • BGR вместо RGB — OpenCV хранит изображения в формате BGR, а не RGB. При передаче в matplotlib или PIL нужно делать cv2.cvtColor(img, cv2.COLOR_BGR2RGB).
  • Тип данных uint8 — большинство операций ожидают uint8 (0–255). Арифметика может дать переполнение; используйте cv2.add() вместо numpy +.
  • imread возвращает None без исключения — если файл не найден, функция возвращает None, а не бросает ошибку. Всегда проверяйте результат.
  • Конфликт пакетов — нельзя одновременно устанавливать opencv-python и opencv-contrib-python; они конфликтуют.
  • Утечка памяти при cap.release() — если не вызвать release() при завершении, захват остаётся открытым и следующий запуск может не получить доступ к камере.
  • Не thread-safe VideoCapture — чтение кадров из нескольких потоков без блокировки приводит к race condition; используйте отдельный поток с очередью.
  • GaussianBlur требует нечётный размер ядра — передача чётного числа (4, 6 и т.д.) вызывает ошибку времени выполнения.

Common mistakes

  • Объяснять opencv applications только синтаксисом без shape, dtype, состояния или режима выполнения.
  • Игнорировать leakage, воспроизводимость, пустые входы и скрытые копии данных.
  • Не проверять production-симптомы: latency, память, ретраи, дрейф качества и несовпадение версий.

What the interviewer is testing

  • Может ли связать opencv applications с реальным контрактом входов и выходов.
  • Упоминает ли тесты, метрики, reproducibility и диагностику ошибок.
  • Видит ли различие между demo-кодом в ноутбуке и production-пайплайном.

Sources

Related topics