Данный Python-скрипт предназначен для обработки фотографий в формате JPG/JPEG, сделанных с дрона DJI с камерой Zenmuse P1. Скрипт рекурсивно обходит указанный каталог, извлекает EXIF-данные из изображений, рассчитывает дополнительные параметры, визуализирует перекрытия фотографий на карте и сохраняет результаты в форматах CSV и Excel. Также скрипт обнаруживает и предупреждает о дубликатах изображений, основываясь на их хеш-суммах, и предоставляет возможность выбрать и скопировать определенное количество изображений на основе заданных критериев.
- Рекурсивный Поиск Изображений: Обходит все вложенные папки и ищет изображения в форматах
.jpgи.jpeg. - Извлечение EXIF-данных: Получает информацию о GPS-координатах, времени съемки, высоте, размерах изображения, фокусном расстоянии и других важных параметрах.
- Расчет Дополнительных Параметров:
- Углы обзора камеры (горизонтальный и вертикальный).
- Размеры захваченной области на земле (в метрах).
- Разрешение изображения (см/пиксель).
- Расстояние до предыдущего снимка (в метрах).
- Типовой линейный размер объекта (в пикселях) при известном размере объекта (1 метр).
- Обнаружение Дубликатов: Выявляет идентичные изображения по их MD5-хешам и предупреждает пользователя, пропуская дубликаты при записи данных.
- Получение Высот Местности: Использует API
open-elevationдля получения высот местности и расчета относительной высоты (relative_altitude). - Визуализация Перекрытий: Создает интерактивную карту с отображением полигонов изображений и их перекрытий с помощью библиотеки Folium.
- Выбор и Копирование Изображений: Позволяет выбрать определенное количество изображений на основе заданных критериев (минимальный процент перекрытия, исключение по ключевому слову, распределение по диапазонам высот) и скопировать их в указанную папку.
- Логирование: Ведет подробный лог работы скрипта, включая отладочную информацию, ошибки и предупреждения. Логи сохраняются в файл
debug.log. - Сохранение Результатов: Экспорт данных в два формата:
- CSV (
output.csv) для простого анализа. - Excel (
output.xlsx) для удобного просмотра и дальнейшей обработки в Microsoft Excel.
- CSV (
- Python: Версия 3.6 и выше.
- Библиотеки Python:
exifreadpandasopenpyxlhashlib(стандартная библиотека)math(стандартная библиотека)csv(стандартная библиотека)os(стандартная библиотека)datetime(стандартная библиотека)requestsshapelypyprojdateutilconcurrent.futures(стандартная библиотека)geopyfoliumlogging(стандартная библиотека)time(стандартная библиотека)random(стандартная библиотека)shutil(стандартная библиотека)
Установка зависимостей:
pip install exifread pandas openpyxl requests shapely pyproj python-dateutil geopy foliumОткройте файл скрипта (script_name.py) в текстовом редакторе и настройте следующие параметры:
# Настраиваемые параметры
ROOT_DIR = r'C:\Path\To\Your\Dataset' # Корневой каталог с изображениями
OUTPUT_CSV = 'output.csv' # Имя выходного CSV файла
OUTPUT_EXCEL = 'output.xlsx' # Имя выходного Excel файла
SENSOR_WIDTH_MM = 36.0 # Ширина сенсора в мм (для камеры Zenmuse P1)
SENSOR_HEIGHT_MM = 24.0 # Высота сенсора в мм (для камеры Zenmuse P1)
OBJECT_SIZE_M = 1.0 # Размер объекта в метрах для расчета size_in_pixels
MAX_WORKERS = 4 # Максимальное количество потоков для параллельной обработки
MAX_FILES_TO_PROCESS = 1000 # Максимальное количество файлов для обработки
# Параметры для выбора и копирования изображений
NUM_IMAGES_TO_SELECT = 50 # Количество изображений для выбора
MIN_OVERLAP_PERCENT = 20.0 # Минимальный процент перекрытия
EXCLUDE_KEYWORD = 'example_keyword' # Ключевое слово для исключения изображений
DESTINATION_DIR = r'C:\Path\To\Selected_Images' # Папка назначения для копирования
DEBUG = True # Флаг отладки. Установите в True для вывода подробной информации- ROOT_DIR: Полный путь к корневой папке, содержащей фотографии. Скрипт будет рекурсивно обходить все вложенные папки внутри этого каталога.
- OUTPUT_CSV: Имя файла CSV, куда будут сохранены результаты обработки.
- OUTPUT_EXCEL: Имя файла Excel, куда будут сохранены результаты обработки.
- SENSOR_WIDTH_MM и SENSOR_HEIGHT_MM: Размеры сенсора камеры в миллиметрах. По умолчанию установлены для камеры Zenmuse P1 (36mm x 24mm).
- OBJECT_SIZE_M: Размер объекта в метрах для расчета типового линейного размера объекта в пикселях.
- MAX_WORKERS: Максимальное количество потоков для параллельной обработки файлов.
- MAX_FILES_TO_PROCESS: Ограничение на количество обрабатываемых файлов. Установите
Noneдля обработки всех файлов. - NUM_IMAGES_TO_SELECT: Количество изображений, которое нужно выбрать для копирования.
- MIN_OVERLAP_PERCENT: Минимальный процент перекрытия между изображениями для выбора.
- EXCLUDE_KEYWORD: Ключевое слово для исключения изображений из выбора (например, если вы хотите исключить изображения, связанные с определенной темой).
- DESTINATION_DIR: Путь к папке, куда будут скопированы выбранные изображения.
- DEBUG: Флаг отладки. Если установлен в
True, скрипт будет записывать подробную информацию о процессе в файлdebug.log.
-
Настройка Скрипта:
Убедитесь, что все параметры в скрипте настроены в соответствии с вашими потребностями, особенно пути к каталогам и параметры выбора изображений.
-
Запуск Скрипта:
Перейдите в каталог, где находится скрипт, и выполните команду:
python scv_calculate.py
Примечание: Замените
scv_calculate.pyна фактическое имя вашего скрипта. -
Процесс Выполнения:
Скрипт выведет в консоль сообщения, информируя о текущем этапе выполнения:
- Сканирование каталогов.
- Количество найденных изображений.
- Параллельная обработка изображений.
- Обнаружение дубликатов.
- Извлечение и расчет параметров.
- Получение высот местности.
- Вычисление перекрытий между изображениями.
- Создание интерактивной визуализации.
- Выбор и копирование изображений на основе заданных критериев.
- Запись данных в CSV и Excel файлы.
- Завершение обработки.
-
Результаты:
После завершения работы скрипта в указанной директории появятся следующие файлы и папки:
output.csv— содержит собранные данные в формате CSV.output.xlsx— содержит те же данные в формате Excel для удобного просмотра и дальнейшей обработки.overlaps_visualization.html— интерактивная карта с визуализацией перекрытий изображений.selected_images.txt— текстовый файл со списком выбранных изображений.- Папка, указанная в
DESTINATION_DIR, содержащая выбранные и скопированные изображения.
-
Механизм Обнаружения:
Скрипт вычисляет MD5-хеш каждого файла изображения. Если хеш уже существует в наборе хешей (
hash_set), файл считается дубликатом, и его обработка пропускается. Пользователь получает предупреждение о каждом обнаруженном дубликате. -
Предупреждения:
При обнаружении дубликата в консоли и лог-файле выводится сообщение:
Предупреждение: Обнаружен дубликат файла <имя_файла>. Запись будет пропущена. -
Общее Сообщение:
Если были обнаружены дубликаты, после обработки всех файлов выводится:
Обнаружены дубликаты файлов. Проверьте предупреждения выше.
-
Интерактивная Карта:
Скрипт создает файл
overlaps_visualization.html, который можно открыть в веб-браузере. Карта отображает полигоны каждого изображения с цветовой индикацией процента перекрытия:- Зеленый: Перекрытие ≤ 15%
- Оранжевый: Перекрытие > 15% и ≤ 50%
- Красный: Перекрытие > 50%
-
Информация на Карте:
При клике на полигон отображается всплывающее окно с информацией:
- Имя файла.
- Процент перекрытия.
- Относительная высота съемки.
-
Критерии Выбора:
- Минимальный Процент Перекрытия: Изображения с перекрытием меньше заданного не будут выбраны.
- Исключение по Ключевому Слову: Изображения, в имени файла или пути которых содержится заданное ключевое слово, будут исключены.
- Распределение по Диапазонам Высот: Изображения распределяются по диапазонам высот (20-80 м, 80-140 м, 140-200 м) для равномерного выбора.
-
Копирование Изображений:
Выбранные изображения копируются в папку, указанную в параметре
DESTINATION_DIR. В консоли и лог-файле выводятся сообщения о процессе копирования.
-
Файл Лога:
Если параметр
DEBUGустановлен вTrue, скрипт ведет подробный лог работы и записывает его в файлdebug.log. -
Содержимое Логов:
- Отладочная информация о процессе обработки.
- Предупреждения и ошибки.
- Информация о повторных попытках при запросах к API.
- Данные о выбранных и скопированных изображениях.
-
Обработка Исключений:
Скрипт устойчив к ошибкам и продолжает работу даже при возникновении исключений с отдельными файлами или запросами к API, выводя соответствующие сообщения.
-
Ограничения API:
При запросах к API
open-elevationскрипт использует механизм повторных попыток с экспоненциальной задержкой, чтобы избежать перегрузки сервера и обработки ошибок 504. -
Настройка Параметров:
Рекомендуется внимательно настроить параметры скрипта в соответствии с вашими потребностями и возможностями системы.
-
Совместимость:
Убедитесь, что все необходимые библиотеки установлены, и используемая версия Python соответствует требованиям.
Ниже приведен пример извлеченных и рассчитанных данных для одного изображения:
filename,relative_path,latitude,longitude,altitude,terrain_elevation,relative_altitude,fov_horizontal,fov_vertical,shooting_time,image_width,image_height,width_meters,height_meters,resolution_cm_per_pixel,distance_to_previous,size_in_pixels,overlap_percentage,digital_zoom_ratio
DJI_0001.JPG,Folder/Subfolder/DJI_0001.JPG,56.092484,36.090163,333.252,300.0,33.252,54.432,37.567,2024-09-07 11:44:38,8192,5460,40.0,30.0,0.5,10.0,200.0,15.0,1.0