OPENCV НА PYTHON | Часть 3 | БАЗОВЫЕ ЗНАНИЯ
Содержание
- Урок 13 Завершение проекта сканера документов
- Урок 14 Распознавание номерных знаков
- Урок 15 Заключение курса
- Чек-лист
- Сканер документов: финализация и оптимизация
- Распознавание номерных знаков (Проект 3)
- Продвинутые методы и оптимизация
- Интеграция и развертывание проектов
- Практические навыки и применение
- Знание областей применения и перспектив развития
- Заключительные навыки и компетенции
- Общие замечания для самопроверки
Урок 13: Завершение проекта сканера документов и обработка ошибок
13.1 Обработка ошибок и улучшение стабильности системы
Суть задачи: Реализовать обработку ошибок для обеспечения стабильной работы сканера документов при отсутствии документа в кадре.
Теоретическая основа:
- Проверка существования объектов: Важно всегда проверять, найден ли контур документа перед применением перспективного преобразования
- Обработка исключений: Система должна корректно работать даже при отсутствии документа в кадре
- Визуальная обратная связь: Пользователь должен понимать текущий статус системы
Ключевой код:
def getContours(img, imgOriginal):
"""
Поиск контура документа с обработкой ошибок при отсутствии контуров
Args:
img (numpy.ndarray): Бинарное изображение после предобработки
imgOriginal (numpy.ndarray): Исходное изображение для визуализации
Returns:
numpy.ndarray: Угловые точки документа или пустой массив если контуры не найдены
numpy.ndarray: Изображение с нарисованными контурами
"""
contours, hierarchy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
biggest = np.array([]) # Инициализация пустого массива для хранения самого большого контура
maxArea = 0
imgWithContours = imgOriginal.copy()
# Поиск самого большого контура с четырьмя углами
for cnt in contours:
area = cv2.contourArea(cnt)
if area > 5000: # Фильтрация по минимальной площади
peri = cv2.arcLength(cnt, True)
approx = cv2.approxPolyDP(cnt, 0.02 * peri, True)
if area > maxArea and len(approx) == 4:
biggest = approx
maxArea = area
# Визуализация всех контуров
cv2.drawContours(imgWithContours, contours, -1, (0, 255, 0), 2)
# Если контур найден, отрисовываем угловые точки
if biggest.size != 0:
cv2.drawContours(imgWithContours, biggest, -1, (0, 0, 255), 20)
cv2.drawContours(imgWithContours, [biggest], -1, (255, 0, 255), 10)
return biggest, imgWithContours
Важные особенности:
- Инициализация
biggest = np.array([])обеспечивает корректную обработку случая, когда контуры не найдены - Проверка
if biggest.size != 0предотвращает ошибки при отсутствии документа - Визуализация всех контуров помогает в отладке и понимании работы алгоритма
- Система остается стабильной даже при полном отсутствии документа в кадре
13.2 Оптимизация перспективного преобразования и улучшение качества
Суть задачи: Улучшить качество сканирования путем оптимизации перспективного преобразования и постобработки.
1. Сортировка угловых точек:
def reorder(myPoints):
"""
Сортировка угловых точек в правильном порядке для перспективного преобразования
Args:
myPoints (numpy.ndarray): Массив угловых точек неупорядоченный
Returns:
numpy.ndarray: Упорядоченный массив точек [верхний левый, верхний правый,
нижний левый, нижний правый]
"""
# Преобразование из формата 4x1x2 в 4x2
myPoints = myPoints.reshape((4, 2))
myPointsNew = np.zeros((4, 1, 2), dtype=np.int32)
# Сумма координат для определения позиций
add = myPoints.sum(1)
# Разница координат для определения позиций
diff = np.diff(myPoints, axis=1)
# Сортировка точек:
# 0: Верхний левый (минимальная сумма координат)
myPointsNew[0] = myPoints[np.argmin(add)]
# 3: Нижний правый (максимальная сумма координат)
myPointsNew[3] = myPoints[np.argmax(add)]
# 1: Верхний правый (минимальная разница координат)
myPointsNew[1] = myPoints[np.argmin(diff)]
# 2: Нижний левый (максимальная разница координат)
myPointsNew[2] = myPoints[np.argmax(diff)]
return myPointsNew
2. Обрезка краев для удаления артефактов:
def getWarp(img, biggest):
"""
Применение перспективного преобразования с обрезкой краев
Args:
img (numpy.ndarray): Исходное изображение
biggest (numpy.ndarray): Угловые точки документа
Returns:
numpy.ndarray: Преобразованное и обрезанное изображение документа
"""
if biggest.size == 0:
return img
# Упорядочивание точек
biggest = reorder(biggest)
# Определение целевых точек
pts1 = np.float32(biggest)
pts2 = np.float32([[0, 0], [widthImg, 0], [0, heightImg], [widthImg, heightImg]])
# Вычисление матрицы преобразования
matrix = cv2.getPerspectiveTransform(pts1, pts2)
# Применение преобразования
imgOutput = cv2.warpPerspective(img, matrix, (widthImg, heightImg))
# Обрезка краев для удаления артефактов (20 пикселей с каждой стороны)
imgCropped = imgOutput[20:imgOutput.shape[0] - 20, 20:imgOutput.shape[1] - 20]
# Восстановление исходного размера после обрезки
imgCropped = cv2.resize(imgCropped, (widthImg, heightImg))
return imgCropped
Важные особенности:
- Правильная сортировка углов критична для корректного перспективного преобразования
- Обрезка краев удаляет артефакты, возникающие при перспективном преобразовании
- Восстановление размера после обрезки обеспечивает стандартизацию выходного изображения
- Система обработки ошибок предотвращает сбои при отсутствии документа
Урок 14: Распознавание номерных знаков автомобилей (Проект 3)
14.1 Теоретическая основа детектирования номерных знаков
Суть проекта: Создать систему для автоматического распознавания автомобильных номерных знаков в реальном времени с веб-камеры.
Теоретическая основа:
- Каскады Хаара: Метод Виолы-Джонса для детектирования объектов в реальном времени
- Регион интереса (ROI): Извлечение и обработка конкретной области изображения
- Фильтрация по площади: Отсеивание ложных срабатываний на основе минимальной площади объекта
- Сохранение результатов: Автоматическое сохранение распознанных номерных знаков
Преимущества системы:
- Высокая скорость работы в реальном времени
- Низкие требования к вычислительным ресурсам
- Возможность работы с различными типами номерных знаков
- Автоматическое сохранение результатов для дальнейшей обработки
14.2 Реализация детектирования номерных знаков
Суть задачи: Реализовать детектирование номерных знаков с использованием предобученных каскадов Хаара.
Ключевой код:
import cv2
import numpy as np
# Загрузка предобученного каскада для детектирования российских номерных знаков
plateCascade = cv2.CascadeClassifier("resources/russian_plates_number.xml")
# Параметры системы
widthImg = 640
heightImg = 480
minArea = 500 # Минимальная площадь для детектирования
color = (255, 0, 255) # Цвет для отрисовки (розовый)
count = 0 # Счетчик сохраненных изображений
# Инициализация веб-камеры
cap = cv2.VideoCapture(1) # Использование второй камеры (ID = 1)
cap.set(3, widthImg)
cap.set(4, heightImg)
cap.set(10, 150) # Установка яркости
while True:
success, img = cap.read()
if not success:
break
imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Детектирование номерных знаков
numberPlates = plateCascade.detectMultiScale(
imgGray,
scaleFactor=1.1,
minNeighbors=4
)
# Обработка каждого обнаруженного номерного знака
for (x, y, w, h) in numberPlates:
area = w * h
if area > minArea: # Фильтрация по площади
# Отрисовка прямоугольника вокруг номерного знака
cv2.rectangle(img, (x, y), (x + w, y + h), color, 2)
cv2.putText(img, "Number Plate", (x, y - 5),
cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, color, 2)
# Извлечение региона интереса (ROI)
imgRoi = img[y:y + h, x:x + w]
cv2.imshow("ROI", imgRoi)
# Отображение основного изображения
cv2.imshow("Result", img)
# Управление: 's' для сохранения, 'q' для выхода
key = cv2.waitKey(1)
if key == ord('s') and 'imgRoi' in locals():
# Сохранение изображения номерного знака
cv2.imwrite(f"resources/scanned/number_plate_{count}.jpg", imgRoi)
# Визуальная обратная связь о сохранении
cv2.rectangle(img, (0, 200), (640, 300), (0, 255, 0), cv2.FILLED)
cv2.putText(img, "Scan Saved", (150, 265),
cv2.FONT_HERSHEY_DUPLEX, 2, (0, 0, 255), 2)
cv2.imshow("Result", img)
cv2.waitKey(500) # Задержка для отображения сообщения
count += 1
print(f"Number plate saved as number_plate_{count-1}.jpg")
elif key == ord('q'):
break
# Очистка ресурсов
cap.release()
cv2.destroyAllWindows()
Важные особенности:
- Предобученный каскад
russian_plates_number.xmlспециально обучен для распознавания российских номерных знаков - Фильтрация по площади (
area > minArea) отсеивает ложные срабатывания на мелких объектах - Регион интереса (ROI) позволяет извлечь только область с номерным знаком для дальнейшей обработки
- Визуальная обратная связь информирует пользователя об успешном сохранении изображения
- Автоматическая нумерация сохраненных файлов предотвращает перезапись существующих изображений
- Задержка после сохранения (
cv2.waitKey(500)) дает пользователю время увидеть подтверждение
14.3 Оптимизация и расширение функционала
Суть задачи: Улучшить качество детектирования и добавить дополнительные функции для повышения полезности системы.
1. Адаптивная яркость для улучшения качества детектирования:
# Автоматическая настройка яркости в зависимости от условий освещения
avg_brightness = np.mean(imgGray)
if avg_brightness < 50: # Темное изображение
cap.set(10, 200) # Увеличение яркости
elif avg_brightness > 200: # Слишком яркое изображение
cap.set(10, 100) # Уменьшение яркости
2. Улучшенная фильтрация ложных срабатываний:
def isValidPlate(plate_roi):
"""
Дополнительная проверка для подтверждения номерного знака
Args:
plate_roi (numpy.ndarray): Регион интереса с предполагаемым номерным знаком
Returns:
bool: True если регион содержит номерной знак, иначе False
"""
# Конвертация в градации серого
roi_gray = cv2.cvtColor(plate_roi, cv2.COLOR_BGR2GRAY)
# Вычисление отношения сторон (номерные знаки обычно имеют определенные пропорции)
h, w = roi_gray.shape
aspect_ratio = w / h
# Проверка соотношения сторон (стандартные номерные знаки ~4:1)
if not (3.5 < aspect_ratio < 5.5):
return False
# Проверка контрастности (номерные знаки имеют высокий контраст)
std_dev = np.std(roi_gray)
if std_dev < 30: # Низкий контраст
return False
return True
3. Система логирования и отчетности:
import datetime
import csv
# Создание лог-файла
log_file = "number_plate_log.csv"
with open(log_file, 'a', newline='') as file:
writer = csv.writer(file)
if file.tell() == 0: # Если файл пустой, записать заголовки
writer.writerow(["Timestamp", "Filename", "Coordinates", "Confidence"])
# Запись в лог при сохранении номерного знака
timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
coordinates = f"{x},{y},{w},{h}"
confidence = area / (widthImg * heightImg) * 100
with open(log_file, 'a', newline='') as file:
writer = csv.writer(file)
writer.writerow([timestamp, f"number_plate_{count-1}.jpg", coordinates, f"{confidence:.2f}%"])
Важные особенности:
- Адаптивная яркость улучшает качество детектирования при различных условиях освещения
- Дополнительная проверка номерных знаков снижает количество ложных срабатываний
- Соотношение сторон и контрастность являются важными признаками для подтверждения номерного знака
- Система логирования предоставляет историю распознанных номерных знаков для анализа
- Координаты и метки времени позволяют отслеживать перемещение автомобилей
- Процент уверенности помогает оценить качество детектирования
Урок 15: Заключение курса
15.1 Итоги изученного материала
Суть курса: За три часа мы освоили основные концепции и практические применения библиотеки OpenCV для компьютерного зрения на Python.
Ключевые темы, изученные в курсе:
1. Основы работы с изображениями:
- Чтение и отображение изображений
- Конвертация цветовых пространств (BGR, HSV, градации серого)
- Базовые операции: размытие, детектирование границ, морфологические операции
- Изменение размера и обрезка изображений
2. Продвинутые методы обработки:
- Детектирование цветов с помощью HSV цветового пространства
- Поиск и анализ контуров для распознавания геометрических фигур
- Детектирование лиц и других объектов с помощью каскадов Хаара
- Перспективные преобразования для коррекции искажений
3. Практические проекты:
- Виртуальная рисовальная доска: Интерактивная система для рисования в воздухе с помощью цветных маркеров
- Сканер документов: Система для автоматического сканирования документов с коррекцией перспективы
- Распознавание номерных знаков: Система для детектирования и сохранения автомобильных номерных знаков
15.2 Практическая значимость полученных знаний
Суть применения: Полученные навыки позволяют решать реальные задачи в различных областях.
Области применения:
Безопасность и мониторинг
- Системы распознавания лиц для контроля доступа
- Детектирование номерных знаков для парковочных систем
- Видеонаблюдение с автоматическим обнаружением аномалий
Промышленная автоматизация
- Контроль качества продукции на производственных линиях
- Распознавание объектов для роботизированных систем
- Измерение геометрических параметров деталей
Медицина и здравоохранение
- Анализ медицинских изображений (рентген, МРТ)
- Автоматическое распознавание клеток и тканей
- Системы поддержки принятия решений для врачей
Потребительские приложения
- Мобильные приложения для дополненной реальности
- Фото- и видеоредакторы с автоматическими функциями
- Интерактивные образовательные приложения
15.3 Рекомендации для дальнейшего развития
Суть развития: Предложения по углублению знаний и расширению практических навыков.
Направления для дальнейшего изучения:
- Углубленное изучение компьютерного зрения:
- Изучение глубокого обучения для компьютерного зрения (TensorFlow, PyTorch)
- Работа с 3D-данными и стереозрением
- Оптический поток и трекинг движущихся объектов
- Практические проекты:
- Создание системы распознавания эмоций по лицу
- Разработка приложения для подсчета посетителей в магазине
- Реализация системы автоматического паркования автомобиля
- Оптимизация производительности:
- Оптимизация кода для работы в реальном времени
- Использование GPU-ускорения для обработки изображений
- Оптимизация для мобильных устройств и embedded-систем
- Интеграция с другими технологиями:
- Комбинирование компьютерного зрения с обработкой естественного языка
- Интеграция с IoT-устройствами и сенсорами
- Разработка full-stack приложений с веб-интерфейсами
Заключительные замечания:
- Практика - ключ к успеху: регулярно реализовывайте небольшие проекты для закрепления знаний
- Эксперименты важны: пробуйте различные параметры и алгоритмы для понимания их влияния
- Сообщество поможет: участвуйте в форумах, задавайте вопросы, делитесь своими проектами
- Документация - ваш друг: официальная документация OpenCV содержит множество примеров и объяснений
ЧЕК-ЛИСТ ПО 3 ЧАСТИ: РАСПОЗНАВАНИЕ НОМЕРНЫХ ЗНАКОВ И ЗАКЛЮЧЕНИЕ
Сканер документов: финализация и оптимизация
| ✓ | Задача |
|---|---|
| Понимаю важность обработки ошибок при отсутствии документа в кадре | |
| Реализовал проверку существования контуров перед применением преобразований | |
| Знаю, как сортировать угловые точки в правильном порядке: | |
|
|
| Реализовал обрезку краев для удаления артефактов перспективного преобразования | |
| Понимаю, как восстановить исходный размер изображения после обрезки | |
| Создал систему визуальной обратной связи для пользователя | |
| Реализовал интерактивный интерфейс с переключением режимов работы |
Распознавание номерных знаков (Проект 3)
| ✓ | Задача |
|---|---|
| Понимаю архитектуру системы детектирования номерных знаков | |
Могу загрузить предобученный каскад для детектирования номерных знаков: cv2.CascadeClassifier("resources/russian_plates_number.xml") |
|
Умею детектировать номерные знаки с помощью detectMultiScale() |
|
| Реализовал фильтрацию по площади для отсеивания ложных срабатываний | |
Знаю, как извлекать регион интереса (ROI) с номерным знаком: imgRoi = img[y:y + h, x:x + w] |
|
| Реализовал систему сохранения изображений с автоматической нумерацией | |
| Создал визуальную обратную связь при сохранении результатов | |
| Понимаю, как добавить систему логирования распознанных номерных знаков | |
| Знаю, как реализовать адаптивную настройку яркости для улучшения качества |
Продвинутые методы и оптимизация
| ✓ | Задача |
|---|---|
| Понимаю принцип работы дополнительной проверки номерных знаков | |
| Умею проверять соотношение сторон для подтверждения объекта | |
| Знаю, как вычислять контрастность для фильтрации изображений | |
| Реализовал систему логирования с сохранением временных меток и координат | |
| Понимаю, как добавить процент уверенности в детектировании | |
| Знаю, как оптимизировать производительность для работы в реальном времени | |
| Понимаю принципы адаптивной обработки при изменении условий освещения |
Интеграция и развертывание проектов
| ✓ | Задача |
|---|---|
| Могу интегрировать все три проекта в единую систему | |
| Понимаю, как развернуть проекты на разных платформах | |
| Знаю, как оптимизировать код для мобильных устройств | |
| Понимаю требования к аппаратному обеспечению для различных задач | |
| Умею документировать код для командной работы | |
| Знаю, как создавать пользовательские интерфейсы для проектов |
Практические навыки и применение
| ✓ | Задача |
|---|---|
| Создал рабочую систему сканера документов с обработкой ошибок | |
| Реализовал систему распознавания номерных знаков с сохранением результатов | |
| Протестировал все проекты в различных условиях освещения | |
| Оптимизировал параметры для конкретных сценариев использования | |
| Добавил обработку исключений и проверку ошибок во все проекты | |
| Реализовал систему логирования для отслеживания работы приложений | |
| Создал документацию для каждого проекта |
Знание областей применения и перспектив развития
| ✓ | Задача |
|---|---|
| Понимаю, как применить полученные навыки в сфере безопасности | |
| Знаю, как использовать компьютерное зрение в промышленной автоматизации | |
| Понимаю возможности применения в медицине и здравоохранении | |
| Знаю, как интегрировать компьютерное зрение в потребительские приложения | |
| Понимаю перспективы развития технологий в области компьютерного зрения | |
| Знаю, какие навыки нужно развивать дальше для профессионального роста | |
| Понимаю, как комбинировать компьютерное зрение с другими технологиями |
Заключительные навыки и компетенции
| ✓ | Задача |
|---|---|
| Могу объяснить основные концепции компьютерного зрения другим | |
| Умею читать и понимать официальную документацию OpenCV | |
| Знаю, где искать дополнительные ресурсы для углубленного изучения | |
| Понимаю, как участвовать в open-source проектах по компьютерному зрению | |
| Знаю, как готовиться к собеседованиям в этой области | |
| Умею презентовать свои проекты и объяснять их практическую значимость | |
| Понимаю этические аспекты использования технологий компьютерного зрения |
Общие замечания для самопроверки
| ✓ | Задача |
|---|---|
| Все проекты работают стабильно без сбоев | |
| Обработка ошибок реализована во всех критических местах | |
| Производительность оптимизирована для работы в реальном времени | |
| Код хорошо документирован и структурирован | |
| Все внешние зависимости корректно указаны | |
| Система логирования работает корректно | |
| Визуальная обратная связь понятна пользователю | |
| Все ресурсы (изображения, каскады) доступны в папке resources | |
| Тестирование проведено на различных изображениях и условиях |
Ссылки по теме
Конспект:
Вторник, 23 декабря 2025
Добавить комментарий

