Перейти к содержимому
OPENCV НА PYTHON | Часть 3 | БАЗОВЫЕ ЗНАНИЯ

OPENCV НА PYTHON | Часть 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 Рекомендации для дальнейшего развития

Суть развития: Предложения по углублению знаний и расширению практических навыков.

Направления для дальнейшего изучения:

  1. Углубленное изучение компьютерного зрения:
    • Изучение глубокого обучения для компьютерного зрения (TensorFlow, PyTorch)
    • Работа с 3D-данными и стереозрением
    • Оптический поток и трекинг движущихся объектов
  2. Практические проекты:
    • Создание системы распознавания эмоций по лицу
    • Разработка приложения для подсчета посетителей в магазине
    • Реализация системы автоматического паркования автомобиля
  3. Оптимизация производительности:
    • Оптимизация кода для работы в реальном времени
    • Использование GPU-ускорения для обработки изображений
    • Оптимизация для мобильных устройств и embedded-систем
  4. Интеграция с другими технологиями:
    • Комбинирование компьютерного зрения с обработкой естественного языка
    • Интеграция с 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
OPENCV НА PYTHON | Часть 3 | БАЗОВЫЕ ЗНАНИЯ