OpenCV в Python: зачем нужен и как использовать для работы с изображениями
Библиотека OpenCV уже давно стала золотым стандартом в мире компьютерного зрения. Эта мощная, открытая и, что немаловажно, бесплатная библиотека позволяет разработчикам научить компьютеры "видеть" и анализировать изображения почти так же, как это делают люди. От распознавания лиц в социальных сетях до автономных транспортных средств – OpenCV используется везде, где машине нужно интерпретировать визуальную информацию.

В этой статье мы разберемся с основами OpenCV в Python – от установки и простейших операций с изображениями до сложных алгоритмов распознавания объектов. Материал будет полезен как новичкам в компьютерном зрении, так и опытным разработчикам, желающим структурировать свои знания и узнать о новых возможностях библиотеки.
Что такое OpenCV?
OpenCV (Open Source Computer Vision Library) – это библиотека с открытым исходным кодом, предназначенная для решения задач компьютерного зрения и машинного обучения. Она предлагает впечатляющий набор из более 2500 алгоритмов – от базовых функций обработки изображений до продвинутых методов распознавания объектов и анализа движения.
Изначально библиотека была разработана Intel в 1999 году, но затем превратилась в независимый проект с активным сообществом разработчиков. Сегодня её используют технологические гиганты вроде Google, Microsoft, IBM и Sony – что, согласитесь, неплохая рекомендация для технологии. Хотя основной код написан на C++, OpenCV имеет интерфейсы для Python, Java, MATLAB и других языков, причем Python-интерфейс является одним из самых популярных благодаря своей простоте и эффективности.
Почему же именно OpenCV, а не какая-нибудь другая модная библиотека? Ну, тут всё достаточно прозрачно и логично (как на чисто вымытом окне, через которое ведется компьютерное зрение – каламбур так себе, но мы работаем над этим):
| Преимущества OpenCV | Недостатки OpenCV |
|---|---|
| Бесплатность и открытый исходный код | Довольно высокий порог входа для новичков |
| Кроссплатформенность (Windows, Linux, MacOS, Android, iOS) | Отсутствие понятных кодов ошибок (а когда они нужны, правда?) |
| Высокая производительность (быстрее, чем Matlab) | Ориентированность на большие платформы, не лучший выбор для микроконтроллеров |
| Богатый набор функций и алгоритмов | Не всегда подробная документация (особенно на русском) |
| Активное сообщество и постоянные обновления | Высокая зависимость от правильной конфигурации среды |
В общем, если вам нужно научить компьютер понимать визуальную информацию – OpenCV это, как говорится, no-brainer, особенно если вы предпочитаете Python. И вам не придется продавать почку для оплаты лицензии, что в наши непростые времена является существенным плюсом.
Где используется OpenCV?
Ключевые сферы применения
Вы, возможно, думаете: "Ну хорошо, библиотека для компьютерного зрения – звучит круто, но зачем мне это в реальной жизни?" И тут я вас удивлю – вы взаимодействуете с результатами работы OpenCV практически каждый день, просто не подозреваете об этом. Компьютерное зрение уже давно вышло за пределы лабораторий и научных статей, и теперь буквально окружает нас повсюду, как надоедливые родственники на семейном празднике.
- Распознавание объектов и лиц – вспомните, как Facebook (или Meta, если вы уже привыкли к ребрендингу) предлагает отметить друзей на фотографиях, а ваш смартфон разблокируется, увидев ваше заспанное лицо. Или как камеры видеонаблюдения в торговом центре отслеживают перемещения посетителей. Все это – OpenCV в действии, хотя, возможно, и с некоторыми проприетарными модификациями.
- Медицинские технологии – здесь компьютерное зрение помогает выявлять аномалии на рентгеновских снимках, МРТ и КТ с точностью, иногда превосходящей опытных врачей. Представьте себе: алгоритм, который никогда не устает, не отвлекается на личные проблемы и видит то, что человеческий глаз может пропустить. Не уверен, стоит ли радоваться или беспокоиться по этому поводу, но технология определенно впечатляет.
- Промышленная автоматизация – системы контроля качества на производстве, сортировка продукции, считывание штрих-кодов и QR-кодов, и всё это быстрее и точнее, чем могли бы делать человеческие операторы (которые, к тому же, имеют обыкновение требовать перерывы, отпуска и прочие неудобные для бизнеса вещи).
- Автономные системы – беспилотные автомобили используют компьютерное зрение для навигации, распознавания дорожных знаков и предотвращения столкновений. Дроны применяют его для облета препятствий и картографирования местности. Роботы-пылесосы – чтобы не падать с лестницы и не поедать ваши носки (хотя тут, судя по отзывам, еще есть над чем работать).
- Анализ видео и изображений – улучшение качества изображения, стабилизация видео, распознавание текста (OCR), поиск похожих изображений. Когда вы ищете в Google по картинке или переводите фото документа в текст – это тоже компьютерное зрение.
- Развлекательные технологии – фильтры в Instagram и Snapchat, реалистичные эффекты в видеоиграх, технологии дополненной реальности. Все эти кроличьи ушки и радужные рвоты – тоже заслуга алгоритмов компьютерного зрения (спасибо или проклинайте их, в зависимости от того, сколько таких фото в вашей ленте).
Список можно продолжать долго, но суть ясна – компьютерное зрение уже глубоко интегрировано в современный мир. И OpenCV играет в этом не последнюю роль, предоставляя разработчикам инструменты для создания всех этих технологий, без необходимости изобретать велосипед с нуля (или скорее "глаз с нуля", если следовать нашей метафоре).
Установка OpenCV в Python
Установка через pip
Установка OpenCV в Python проста, как две строчки кода. В отличие от некоторых других библиотек, которые заставляют вас танцевать с бубном вокруг зависимостей и компиляторов, тут всё гораздо цивилизованнее. Открываете терминал или командную строку и вводите заветное заклинание:
pip install opencv-python
И вуаля! Базовая версия OpenCV установлена. Но если вы из тех, кто считает, что "базовый" – это скучно и недостаточно, и вам нужны все дополнительные модули (а там есть на что посмотреть – от 3D-реконструкции до text-to-speech), то выбирайте расширенную версию:
pip install opencv-contrib-python
Между прочим, стоит отметить разницу между этими двумя пакетами. opencv-python содержит только основные модули, которых достаточно для большинства задач (и занимает меньше места на диске – что немаловажно, если вы работаете на древнем ноутбуке, который начинает кашлять при установке любой библиотеки размером больше 100 МБ). А opencv-contrib-python включает все дополнительные модули, экспериментальные алгоритмы и новейшие разработки. Выбор за вами – быть минималистом или максималистом.

Проверка работоспособности
Чтобы убедиться, что установка прошла успешно (и не придется через полчаса отлаживать непонятные ошибки), выполните простую проверку:
import cv2 print(cv2.__version__)
Если вы видите номер версии вместо красного сообщения об ошибке – поздравляю, вы только что сделали первый шаг в мир компьютерного зрения! Если же видите ошибку... ну, добро пожаловать в реальный мир разработки, где 90% времени уходит на устранение проблем, а не на написание кода.
Основные функции OpenCV (базовые операции)
Чтение, отображение и сохранение изображений
Итак, вы установили OpenCV и теперь сидите, глядя на пустой редактор кода, и думаете: "И что же мне с этим делать?" Начнем с базовых операций – чтения, отображения и сохранения изображений, без которых в компьютерном зрении вы далеко не уедете (примерно как автомобиль без колес – технически это всё ещё автомобиль, но пользы от него немного).
Загрузка изображения выполняется с помощью функции cv2.imread:
import cv2
# Путь может быть относительным или абсолютным - главное, чтобы файл существовал
image = cv2.imread('путь/к/изображению.jpg')Казалось бы, что может быть проще? Но OpenCV умудряется внести хаос даже в этот простой процесс. Дело в том, что библиотека читает изображения в формате BGR (синий-зеленый-красный), а не в привычном RGB (красный-зеленый-синий). Почему? История умалчивает. Возможно, разработчики решили, что компьютерное зрение должно видеть мир иначе, чем люди – в конце концов, это же не человеческое зрение!
Теперь, когда у нас есть изображение, давайте покажем его миру (или хотя бы себе):
cv2.imshow('Название окна', image)
cv2.waitKey(0) # Ждем нажатия любой клавиши
cv2.destroyAllWindows() # Закрываем все окна OpenCVФункция waitKey(0) – это не просто декоративный элемент. Без нее изображение мелькнет на экране и тут же исчезнет, оставив вас в недоумении – было ли что-то или показалось? Если вместо 0 указать число, например 1000, изображение будет отображаться указанное количество миллисекунд.
Сохранение изображения – это как чтение, только наоборот:
cv2.imwrite('новое_изображение.jpg', image)Работа с цветами и преобразование изображений
Как я уже упоминал, OpenCV использует формат BGR вместо RGB, что может привести к интересным результатам, если вы не знаете об этом (например, все ваши красные объекты вдруг станут синими, и наоборот). Если вы хотите работать в RGB, можно конвертировать изображение:
rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
Преобразование в оттенки серого – классическая операция в обработке изображений (и часто первый шаг перед более сложными алгоритмами):
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
Бинаризация (преобразование в черно-белое изображение) – еще одна фундаментальная операция:
_, binary_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)
Здесь 127 – пороговое значение (всё, что темнее, станет черным, всё, что светлее – белым), 255 – максимальное значение для пикселей. Загадочный символ _ в начале игнорирует первое возвращаемое значение – порог, который был использован для бинаризации (в данном случае мы его сами задали, поэтому он нам не интересен).
Операции с изображениями
Изменение размера изображения – частая операция, особенно если вы работаете с моделями машинного обучения, которые требуют входных данных определенного размера:
# Уменьшаем изображение вдвое resized_image = cv2.resize(image, (image.shape[1]//2, image.shape[0]//2)) # Или задаем конкретный размер resized_image = cv2.resize(image, (300, 200))
Обрезка изображения в OpenCV выполняется через синтаксис срезов NumPy:
# Обрезаем центральную часть изображения cropped_image = image[100:300, 200:400]
Поворот требует чуть больше кода – нужно создать матрицу поворота:
rows, cols = image.shape[:2] M = cv2.getRotationMatrix2D((cols/2, rows/2), 90, 1) # поворот на 90 градусов вокруг центра rotated_image = cv2.warpAffine(image, M, (cols, rows))
Размытие – полезная операция для уменьшения шума и деталей:
blurred_image = cv2.GaussianBlur(image, (5, 5), 0)
Параметр (5, 5) определяет размер ядра размытия – чем больше числа, тем сильнее эффект размытия. Числа должны быть нечетными, иначе ядро не будет иметь четко определенного центра, и OpenCV выразит свое недовольство ошибкой.
Рисование на изображении
OpenCV позволяет рисовать на изображениях различные примитивы – линии, прямоугольники, круги и даже текст:
# Создаем копию изображения, чтобы не испортить оригинал canvas = image.copy() # Рисуем линию cv2.line(canvas, (0, 0), (200, 200), (0, 0, 255), 5) # красная линия толщиной 5 пикселей # Рисуем прямоугольник cv2.rectangle(canvas, (300, 100), (500, 300), (255, 0, 0), 3) # синий прямоугольник # Добавляем текст cv2.putText(canvas, "Hello, OpenCV!", (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
Обратите внимание на формат цвета – он в BGR! Поэтому (0, 0, 255) – это красный, а не синий. Это та самая особенность OpenCV, о которой я уже упоминал и которая может привести к неожиданным результатам, если вы о ней забудете.
Это базовые операции, которые помогут вам начать работу с OpenCV. Они простые, но мощные – комбинируя их, вы уже можете создавать вполне функциональные приложения для обработки изображений. Но мы только начали – дальше будет еще интереснее!
Расширенные возможности OpenCV
Обнаружение контуров
Если базовые операции с изображениями – это азбука компьютерного зрения, то обнаружение контуров – это уже первые полноценные фразы. Контуры – это границы объектов на изображении, и их выделение – ключевой шаг для распознавания форм и объектов.
Процесс обычно начинается с преобразования изображения в оттенки серого и применения бинаризации или детектора краев. Затем на этой основе находятся контуры:
import cv2
import numpy as np
# Загружаем изображение и преобразуем в оттенки серого
image = cv2.imread('objects.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Применяем размытие для уменьшения шума
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
# Бинаризация изображения
_, thresh = cv2.threshold(blurred, 60, 255, cv2.THRESH_BINARY)
# Находим контуры
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# Рисуем найденные контуры на оригинальном изображении
cv2.drawContours(image, contours, -1, (0, 255, 0), 2)Функция findContours возвращает список контуров – каждый из которых представляет собой набор точек, образующих замкнутую форму. Флаг cv2.RETR_EXTERNAL указывает, что мы ищем только внешние контуры (игнорируя "дырки" внутри объектов), а cv2.CHAIN_APPROX_SIMPLE говорит о том, что мы хотим упрощенное представление контуров (например, прямоугольник будет представлен всего четырьмя точками, а не всеми точками периметра).
Можно также отфильтровать контуры по размеру, чтобы избавиться от шумов:
filtered_contours = [] for contour in contours: area = cv2.contourArea(contour) if area > 500: # Минимальная площадь контура в пикселях filtered_contours.append(contour)
Распознавание лиц
Распознавание лиц – одна из самых популярных задач компьютерного зрения, и OpenCV предоставляет для этого готовые инструменты, в частности, каскады Хаара – алгоритм, разработанный ещё в 2001 году, но до сих пор актуальный благодаря своей скорости и простоте.
import cv2
# Загружаем предобученный каскад для распознавания лиц
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# Загружаем изображение и преобразуем в оттенки серого
image = cv2.imread('group_photo.jpg')
gray = cv2.cvtColor(image, 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(image, (x, y), (x+w, y+h), (0, 255, 0), 2)Метод detectMultiScale принимает несколько параметров, которые влияют на точность и скорость распознавания:
- scaleFactor – определяет, насколько уменьшается размер изображения при каждом масштабе (значение 1.1 означает уменьшение на 10%).
- minNeighbors – определяет, сколько "соседей" должен иметь каждый кандидат в лица, чтобы считаться лицом. Увеличение этого параметра снижает количество ложных срабатываний, но может пропустить некоторые лица.
- minSize – минимальный размер лица, которое мы хотим найти.
Каскады Хаара есть не только для лиц, но и для глаз, улыбок и других объектов. Однако, стоит отметить, что этот метод не самый современный и может давать сбои при сложном освещении, поворотах головы или частичном перекрытии лица.
Работа с видео
OpenCV позволяет обрабатывать не только статичные изображения, но и видеопотоки – будь то видеофайлы или изображение с камеры:
import cv2
# Открываем видеофайл или камеру (0 - обычно веб-камера)
cap = cv2.VideoCapture('video.mp4') # или cap = cv2.VideoCapture(0)
while True:
# Считываем кадр
ret, frame = cap.read()
# Проверяем, успешно ли считан кадр
if not ret:
break
# Здесь можно обрабатывать кадр, например, находить лица
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.1, 5)
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
# Отображаем результат
cv2.imshow('Video', frame)
# Выход при нажатии клавиши 'q'
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# Освобождаем ресурсы
cap.release()
cv2.destroyAllWindows()Для отслеживания движущихся объектов можно использовать разные подходы. Один из простейших – вычитание фона:
# Создаем вычитатель фона
background_subtractor = cv2.createBackgroundSubtractorMOG2()
while True:
ret, frame = cap.read()
if not ret:
break
# Применяем вычитание фона
foreground_mask = background_subtractor.apply(frame)
# Находим контуры движущихся объектов
contours, _ = cv2.findContours(foreground_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# Рисуем рамки вокруг движущихся объектов
for contour in contours:
if cv2.contourArea(contour) > 500: # Фильтруем мелкие шумы
(x, y, w, h) = cv2.boundingRect(contour)
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.imshow('Motion Detection', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
breakЭто лишь верхушка айсберга расширенных возможностей OpenCV. Библиотека предлагает множество других алгоритмов – от сопоставления шаблонов и выделения особых точек до оптического потока и 3D-реконструкции. Выбор конкретных инструментов зависит от специфики вашей задачи и доступных вычислительных ресурсов.
OpenCV и машинное обучение
Хотя OpenCV и сам по себе довольно мощный инструмент, настоящая магия начинается, когда вы объединяете его с современными алгоритмами машинного обучения. Это как взять старый добрый нож (весьма острый и полезный инструмент) и модернизировать его до лазерного меча – функциональность та же, но возможности и эффектность просто космические.

В современном компьютерном зрении нейронные сети доминируют практически во всех задачах – от классификации изображений до семантической сегментации. И OpenCV не остался в стороне от этого тренда, предлагая модуль dnn (Deep Neural Networks), который позволяет использовать предварительно обученные нейросети.
Приведу пример использования модели YOLO (You Only Look Once) – одной из самых популярных нейросетей для обнаружения объектов. YOLO настолько быстра, что может работать в режиме реального времени даже на среднестатистическом ноутбуке (хотя, конечно, с GPU всё работает гораздо шустрее).
import cv2
import numpy as np
# Загружаем YOLO
net = cv2.dnn.readNet("yolov3.weights", "yolov3.cfg")
layer_names = net.getLayerNames()
output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()]
# Загружаем классы объектов
with open("coco.names", "r") as f:
classes = [line.strip() for line in f.readlines()]
# Загружаем изображение
image = cv2.imread("room.jpg")
height, width, channels = image.shape
# Предобработка изображения
blob = cv2.dnn.blobFromImage(image, 0.00392, (416, 416), (0, 0, 0), True, crop=False)
net.setInput(blob)
outs = net.forward(output_layers)
# Информация для отображения
class_ids = []
confidences = []
boxes = []
# Обработка результатов
for out in outs:
for detection in out:
scores = detection[5:]
class_id = np.argmax(scores)
confidence = scores[class_id]
if confidence > 0.5: # Порог уверенности
# Координаты объекта
center_x = int(detection[0] * width)
center_y = int(detection[1] * height)
w = int(detection[2] * width)
h = int(detection[3] * height)
# Координаты прямоугольника
x = int(center_x - w / 2)
y = int(center_y - h / 2)
boxes.append([x, y, w, h])
confidences.append(float(confidence))
class_ids.append(class_id)
# Подавление не-максимумов (чтобы убрать дублирующие рамки)
indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)
# Рисуем рамки и подписи
for i in range(len(boxes)):
if i in indexes:
x, y, w, h = boxes[i]
label = str(classes[class_ids[i]])
confidence = confidences[i]
color = (0, 255, 0) # Зеленый цвет для рамки
cv2.rectangle(image, (x, y), (x + w, y + h), color, 2)
cv2.putText(image, f"{label} {confidence:.2f}", (x, y - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)
# Отображаем результат
cv2.imshow("Object Detection", image)
cv2.waitKey(0)
cv2.destroyAllWindows()Интеграция с TensorFlow или PyTorch – еще один мощный подход. Вы можете использовать OpenCV для предобработки изображений и потоковой передачи кадров, а затем передавать их в модель, обученную в одном из этих фреймворков:
import cv2
import numpy as np
import tensorflow as tf
# Загружаем предобученную модель (например, MobileNet)
model = tf.keras.applications.MobileNetV2(weights='imagenet')
# Функция для предсказания
def predict_image(img):
# Предобработка для MobileNet
img = cv2.resize(img, (224, 224))
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # OpenCV использует BGR, TensorFlow - RGB
img = img / 255.0 # Нормализация
img = np.expand_dims(img, axis=0) # Добавляем размерность батча
# Предсказание
predictions = model.predict(img)
return tf.keras.applications.mobilenet_v2.decode_predictions(predictions, top=3)[0]
# Захват видео с камеры
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
# Получаем предсказания
results = predict_image(frame)
# Отображаем результаты на кадре
y = 30
for i, (_, label, prob) in enumerate(results):
text = f"{label}: {prob*100:.2f}%"
cv2.putText(frame, text, (10, y + i*30), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2)
cv2.imshow("Classification", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()OpenCV также может использоваться для сегментации изображений с помощью сетей, таких как Mask R-CNN или U-Net. Это позволяет не просто находить объекты, но и точно выделять их границы:
# Пример загрузки и использования Mask R-CNN
net = cv2.dnn.readNetFromTensorflow('mask_rcnn_inception_v2_coco_2018_01_28/frozen_inference_graph.pb',
'mask_rcnn_inception_v2_coco_2018_01_28/mask_rcnn_inception_v2_coco_2018_01_28.pbtxt')
# Настройки сети
blob = cv2.dnn.blobFromImage(image, swapRB=True)
net.setInput(blob)
# Получаем маски и ограничивающие рамки
boxes, masks = net.forward(['detection_out_final', 'detection_masks'])
# Далее следует обработка результатов и визуализация
# ...Машинное обучение и компьютерное зрение – идеальная пара, как кофе и утро понедельника. OpenCV в этой паре играет роль связующего звена между сырыми данными и интеллектуальными алгоритмами, обеспечивая удобный интерфейс для работы с изображениями и видео. Конечно, для серьезных современных задач OpenCV часто используется в сочетании с более специализированными библиотеками, но его место в экосистеме компьютерного зрения остается прочным.
Заключение
Вот мы и пробежались по основным возможностям OpenCV для Python – от простейших операций вроде открытия изображения до интеграции с нейронными сетями для решения сложных задач компьютерного зрения. И хотя эта статья лишь верхушка айсберга (на самом деле, скорее снежинка на вершине айсберга, учитывая колоссальные возможности библиотеки), надеюсь, она дала вам представление о том, что можно сделать с помощью OpenCV.
Компьютерное зрение – одна из тех областей ИИ, которая уже сейчас глубоко интегрирована в нашу повседневную жизнь, и её влияние будет только расти. От автомобилей, которые сами находят дорогу, до телефонов, распознающих наши лица – всё это результат работы алгоритмов, схожих с теми, о которых мы говорили в этой статье.
Если вы только начинаете свой путь в компьютерном зрении – не пытайтесь охватить всё сразу. Начните с простого проекта, например, с распознавания объектов определенного типа или с создания фильтра для изображений. Постепенно усложняйте задачи, изучайте новые алгоритмы и методы. И помните – практика намного важнее теории. Можно прочитать тысячи статей об OpenCV, но без реальных проектов, без ошибок и их исправления, без экспериментов и неудач настоящего понимания не придет.
А если вы уже опытный разработчик – возможно, эта статья напомнила вам о каких-то функциях или подходах, которые вы давно не использовали. В мире, где все гонятся за новейшими нейросетями, иногда полезно вспомнить о классических методах, которые порой могут быть более эффективными для конкретной задачи.
Удачи вам в изучении и применении OpenCV! Пусть ваши алгоритмы будут быстрыми, а результаты – точными.
Если вы хотите глубже погрузиться в Python и освоить не только OpenCV, но и другие ключевые инструменты программирования, рекомендуем обратить внимание на подборку курсов по Python на сайте Kurshub. Там собраны актуальные обучающие программы по самым разным направлениям — от основ синтаксиса до работы с нейросетями и компьютерным зрением.
Рекомендуем посмотреть курсы по Python
| Курс | Школа | Цена | Рассрочка | Длительность | Дата начала | Ссылка на курс |
|---|---|---|---|---|---|---|
Профессия Python-разработчик | Eduson Academy 137 отзывов | Цена 116 400 ₽ Ещё -5% по промокоду | От 9 700 ₽/мес | Длительность 6 месяцев | Старт 20 августа | Подробнее |
Fullstack-разработчик на Python | Нетология 47 отзывов | Цена 175 800 ₽ 325 635 ₽ с промокодом kursy-online | От 5 427 ₽/мес | Длительность 18 месяцев | Старт 27 августа | Подробнее |
Python-разработчик + ИИ | ProductStar 65 отзывов | Цена 100 224 ₽ 250 560 ₽ Ещё -5% по промокоду | От 2 784 ₽/мес На 2 года. | Длительность 10 месяцев | Старт 19 августа | Подробнее |
Профессия Python-разработчик + ИИ | Skillbox 262 отзыва | Цена 157 335 ₽ 314 670 ₽ Ещё -20% по промокоду | От 4 628 ₽/мес 9 715 ₽/мес | Длительность 12 месяцев | Старт 22 августа | Подробнее |
Python-разработчик | Яндекс.Практикум 103 отзыва | Цена 159 000 ₽ | От 18 500 ₽/мес | Длительность 9 месяцев Можно взять академический отпуск | Старт 27 августа | Подробнее |

Менеджер AI-комьюнити и базы знаний: кто помогает пользователям разбираться в сервисах, чатах и инструкциях

Специалист по адаптации новых сотрудников в цифровых командах: как onboarding стал отдельной профессией

Аналитик рекрутинга: кто считает воронку найма, стоимость кандидата и эффективность каналов
