Освоение OpenCV cv2 в Python
Модуль cv2 предоставляет широкие возможности для компьютерного зрения в Python. Он позволяет загружать, обрабатывать и сохранять изображения и видео, а также выполнять обнаружение объектов, калибровку камер и многое другое.
Основные возможности модуля cv2
Наиболее эффективным подходом для начала работы с изображением является использование функций imread, imshow и imwrite. Ниже приведен базовый пример:
import cv2
# Загрузка изображения
img = cv2.imread('example.jpg')
# Проверка успешности загрузки
if img is None:
print("Ошибка загрузки изображения. Проверьте путь.")
else:
# Отображение в окне
cv2.imshow('Image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# Сохранение копии
cv2.imwrite('example_copy.jpg', img)Python module attributes (атрибуты модуля в python)
Функция waitKey(0) ожидает нажатия клавиши, иначе окно закроется сразу. destroyAllWindows закрывает все созданные окна.
Типичная ошибка: cv2.imshow не работает в средах Jupyter Notebook или в удаленных сессиях. В таких случаях рекомендуется использовать библиотеку matplotlib для отображения:
from matplotlib import pyplot as plt
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()Python module version (версия модуля python)
Как изменить размер изображения с сохранением пропорций?
Для масштабирования изображения применяется cv2.resize. Чтобы сохранить пропорции, необходимо вычислить новый размер на основе коэффициента масштабирования:
scale_percent = 50 # уменьшаем до 50%
width = int(img.shape[1] * scale_percent / 100)
height = int(img.shape[0] * scale_percent / 100)
dim = (width, height)
resized = cv2.resize(img, dim, interpolation=cv2.INTER_AREA)Python cpp module (взаимодействие python с модулями c++)
Параметр interpolation влияет на качество: при уменьшении лучше использовать INTER_AREA, при увеличении - INTER_CUBIC или INTER_LINEAR.
Ошибка: если новый размер не целочисленный, функция округлит его автоматически. Важно всегда приводить к целым числам.
Как перевести изображение в оттенки серого?
Преобразование цветового пространства выполняется с помощью cv2.cvtColor. Для серого используется флаг COLOR_BGR2GRAY:
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)Python module cv2 (модуль cv2 (opencv) в python)
Теперь gray - одноканальное изображение. Его можно отобразить с помощью plt.imshow(gray, cmap='gray').
Путаница цветовых каналов: OpenCV использует порядок BGR, а matplotlib - RGB. Если не преобразовать, цвета будут некорректными.
Как сгладить изображение для уменьшения шума?
Размытие (сглаживание) реализуется через cv2.GaussianBlur. Указывается размер ядра (нечетное число) и стандартное отклонение:
blurred = cv2.GaussianBlur(img, (5,5), 0)Python encodings module (модуль encodings в python)
Яркое изображение станет менее резким, что полезно перед обнаружением границ.
Большое ядро сильно размывает изображение и замедляет обработку. Рекомендуется выбирать размер в зависимости от степени шума.
Как выделить границы объектов на изображении?
Алгоритм Канни реализован в cv2.Canny. Требуются два порога для подавления немаксимумов:
edges = cv2.Canny(gray, 100, 200)Platform module python (модуль platform в python)
Пороги подбираются экспериментально. Результат - бинарное изображение с контурами.
Слишком низкие пороги дают много ложных границ, слишком высокие - теряют реальные границы. Рекомендуется предварительно размыть изображение.
Как захватить видео с веб-камеры?
Для работы с видеопотоком используется cv2.VideoCapture. Указывается индекс камеры (0 - первая камера). Далее кадры считываются в цикле:
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
cv2.imshow('Frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()Python string module (модуль string в python)
Проверка ret обязательна - при ошибке чтения кадра цикл завершится корректно.
Если камера не открывается, следует проверить права доступа и подключение. Иногда помогает смена индекса (1, 2).
Как нанести аннотации на изображение?
На изображение можно рисовать геометрические фигуры и текст через cv2.circle, cv2.rectangle, cv2.putText:
cv2.rectangle(img, (50,50), (200,200), (0,255,0), 2)
cv2.circle(img, (100,100), 10, (255,0,0), -1)
cv2.putText(img, 'Example', (10,30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 2)Module sys python (модуль sys в python)
Аргументы: изображение, координаты, цвет BGR, толщина (толщина линии для контура, -1 для заливки).
При наложении текста может быть сложно подобрать шрифт и размер. Рекомендуется предварительно вычислить размер текста с помощью cv2.getTextSize.
Как создать изображение из массива пикселей?
Изображение в OpenCV представлено numpy массивами. Можно создать пустое изображение через np.zeros:
import numpy as np
height, width = 400, 600
blank = np.zeros((height, width, 3), dtype=np.uint8)
blank[:] = (255,0,0) # синий фон
# или рисовать пиксели
blank[200:300, 100:200] = (0,0,255)Такой подход применяется для создания синтетических изображений или масок.
Тип данных должен быть uint8 (0-255). Если использовать float, отображение будет некорректным.
Расширенные примеры использования cv2
Ниже приведены более сложные сценарии, которые могут потребоваться в реальных проектах.
Обнаружение лиц с помощью каскада Хаара
OpenCV поставляется с предобученными каскадами для обнаружения лиц, глаз и других объектов. Необходимо загрузить классификатор и применить его к изображению:
import cv2
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
img = cv2.imread('people.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30,30))
for (x,y,w,h) in faces:
cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)
cv2.imshow('Face Detection', img)
cv2.waitKey(0)
cv2.destroyAllWindows()Результат: на изображении будут выделены прямоугольниками все найденные лица.
[изображение с прямоугольниками]
Параметры scaleFactor и minNeighbors управляют точностью и скоростью. Уменьшение scaleFactor повышает точность, но замедляет работу.
Поиск контуров и подсчет объектов
Контуры помогают выделить границы объектов и проанализировать их форму. Пример:
contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours, -1, (0,0,255), 2)
print(f"Найдено {len(contours)} контуров")Результат: красные контуры наложены на исходное изображение, в консоль выводится количество объектов.
Найдено 5 контуров
Метод cv2.RETR_EXTERNAL извлекает только внешние контуры, CHAIN_APPROX_SIMPLE сжимает точки для экономии памяти.
Чтение видеофайла и обработка каждого кадра
Обработка видео аналогична работе с камерой, но источник - файл. Дополнительно можно сохранять результат в новое видео с помощью cv2.VideoWriter:
cap = cv2.VideoCapture('input_video.mp4')
fps = int(cap.get(cv2.CAP_PROP_FPS))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('output_video.mp4', fourcc, fps, (width, height))
while True:
ret, frame = cap.read()
if not ret:
break
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
gray_bgr = cv2.cvtColor(gray_frame, cv2.COLOR_GRAY2BGR)
out.write(gray_bgr)
cv2.imshow('Processed', gray_frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
out.release()
cv2.destroyAllWindows()Результат: создается новое видео в оттенках серого.
[файл output_video.mp4]
Ошибки: неправильно выбранный кодек (fourcc) может привести к невозможности воспроизведения. Рекомендуется использовать 'mp4v' для MP4 или 'XVID' для AVI.
Сопоставление шаблонов (Template Matching)
Метод cv2.matchTemplate ищет фрагмент изображения (шаблон) в основном изображении:
img = cv2.imread('scene.jpg')
template = cv2.imread('template.jpg')
h, w = template.shape[:2]
res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
cv2.rectangle(img, top_left, bottom_right, (0,255,0), 2)
cv2.imshow('Matched', img)
cv2.waitKey(0)Результат: зеленый прямоугольник вокруг найденной области.
[изображение с прямоугольником]
Значение max_val указывает степень совпадения (0-1). Для надежности можно установить порог.
Интерактивный трекбар
OpenCV позволяет создавать ползунки (trackbar) для настройки параметров в реальном времени. Пример регулировки порогов Canny:
def nothing(x):
pass
cv2.namedWindow('Canny')
cv2.createTrackbar('Low', 'Canny', 50, 255, nothing)
cv2.createTrackbar('High', 'Canny', 150, 255, nothing)
while True:
img = cv2.imread('image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
l = cv2.getTrackbarPos('Low', 'Canny')
h = cv2.getTrackbarPos('High', 'Canny')
edges = cv2.Canny(gray, l, h)
cv2.imshow('Canny', edges)
k = cv2.waitKey(1) & 0xFF
if k == 27:
break
cv2.destroyAllWindows()Результат: окно с настраиваемыми порогами, изменения отображаются в реальном времени.
[интерактивное окно]
Функция nothing необходима как callback, но её содержимое может быть пустым.