Delphi opencv: Использование OpenCV в Delphi

Использование OpenCV в Delphi

Создатели библиотеки компьютерного зрения OpenCV позаботились о разработчиках, которые программируют на C++, C, Python и Java, ведь для этих языков есть официальные интерфейсы. А что же делать Delphi-разработчикам? На помощь приходит неофициальный проект Delphi-OpenCV, созданный и поддерживаемый российскими разработчиками, который предоставляет обёртки для библиотеки OpenCV. Давайте пробовать, насколько просто или сложно, установить, настроить и использовать OpenCV в Delphi.

По сути Delphi-OpenCV — это набор заголовочных файлов переведённых на Delphi + компоненты для среды разработки Delphi на их основе. На момент написания статьи, обёртки написаны для OpenCV версии 2.4.11, поддерживаются Delphi 2010 Delphi 10.1 Berlin. Проект Delphi-OpenCV бесплатный, имеет открытые исходные коды и опубликован на сайтах GitHub и SourceForge. Там же указаны кошельки авторов проекта, и если вы хотите оказать поддержку или выразить благодарность, вы можете это сделать материально.

Установка и настройка Delphi-OpenCV

Прежде всего, скачайте архив с файлами проекта Delphi-OpenCV отсюда. Затем приготовьте следующие файлы необходимые для полноценной работы OpenCV:

  1. Файлы распространяемых пакетов Visual C++ для Visual Studio 2013. Найти их можно в архиве Delphi-OpenCV: в папке redist\VC2013x86 – файлы для 32-битной Windows и в папке redist\VC2013x64 – для 64-битной. Вот какие файлы понадобятся: msvcp120.dll, msvcr120.dll, msvcp120d.dll и msvcr120d.dll.
  2. Библиотеки кодеков FFMPEG для Windows, скачать которые можно здесь. Скачивать нужно версию Shared, т.к. в ней есть нужные .dll файлы. Из скачанного архива нам нужны все .dll файлы и папки bin, такие как avcodec-57.dll, avdevice-57.dll, avfilter-6.dll, avformat-57.dll и т.д.
  3. Библиотека OpenCV, скачать которую можно здесь. После распаковки архива вам понадобятся .dll файлы из папок \build\x64\vc12\bin (здесь 64-битные файлы) и \build\x86\vc12\bin (здесь 32-битные файлы), а если точнее, то файлы с именами, оканчивающимися на 2411.dll или 2411d.dll.
  4. Некоторым примерам (FFMPEG) требуются библиотеки SDL 2.0 и SDL 1.2 (файлы SDL.dll и SDL2.dll), скачать которые можно здесь.

Скопируйте все перечисленные выше файлы в следующие системные папки:

  1. Если у вас 32-битная Windows, то скопируйте 32-битные файлы в папку C:\Windows\System32\.
  2. Если у вас 64-битная Windows, то:
    1. скопируйте 64-битные файлы в папку C:\Windows\System32\, если будете разрабатывать 64-битные приложения;
    2. скопируйте 32-битные файлы в папку C:\Windows\SysWOW64\, если будете разрабатывать 32-битные приложения.

Файлы распространяемых пакетов Visual C++ для Visual Studio 2013 могут быть установлены автоматически с помощью дистрибутива, который можно скачать здесь.

После того как все файлы на местах, распакуйте архив с файлами Delphi-OpenCV в удобное для вас место (у меня это C:\Projects\OpenCV), затем пропишите пути к распакованным папкам в среде Delphi. Для этого закройте все проекты, если они у вас открыты (пункт меню «File -> Close All») и откройте диалог настроек (пункт меню «Tools -> Options..»). В диалоге настроек откройте редактор путей («Environment Options -> Delphi Options -> Library -> Library Path:») и добавьте в список пути к следующим папкам:

<PROJECT_ROOT>\source
<PROJECT_ROOT>\source\utils
<PROJECT_ROOT>\source\component
<PROJECT_ROOT>\source\sdl
<PROJECT_ROOT>\source\sdl2
<PROJECT_ROOT>\source\opengl
<PROJECT_ROOT>\source\ffmpeg
<PROJECT_ROOT>\resource\facedetectxml

где <PROJECT_ROOT> — это папка, куда вы распаковали архив. Т.е. у меня папка <PROJECT_ROOT>\source будет иметь следующий вид: C:\Projects\OpenCV\source.

Затем откройте, откомпилируйте и установите следующие проекты (первый проект в списке нужно только откомпилировать):

<PROJECT_ROOT>\source\component\DelphiXX\OpenCVXXX.dpk
<PROJECT_ROOT>\source\component\DelphiXX\dclCommonOpenCVXXX.dpk
<PROJECT_ROOT>\source\component\DelphiXX\dclVCLOpenCVXXX.dpk
<PROJECT_ROOT>\source\component\DelphiXX\dclFMXOpenCVXXX.dpk
<PROJECT_ROOT>\source\component\DelphiXX\ dclFFMSourceXXX.dpk


где <PROJECT_ROOT> — это папка, куда вы распаковали архив, DelphiXX – это папка для вашей версии Delphi (я использую Embarcadero RAD Studio 10 Seattle, поэтому у меня это будет папка Delphi 10 Seattle), XXX – это номер версии среды разработки (у Delphi 10 Seattle номер версии 23.0, поэтому вместо XXX у меня будет 230). Т.е. для моего случая пути к проектам будут следующими:

C:\Projects\OpenCV\source\component\Delphi 10 Seattle\OpenCV230.dpk
C:\Projects\OpenCV\source\component\Delphi 10 Seattle\dclCommonOpenCV230.dpk
C:\Projects\OpenCV\source\component\Delphi 10 Seattle\dclVCLOpenCV230.dpk
C:\Projects\OpenCV\source\component\Delphi 10 Seattle\dclFMXOpenCV230.dpk
C:\Projects\OpenCV\source\component\Delphi 10 Seattle\dclFFMSource230.dpk

Порядок установки не меняйте.

Примеры Delphi-OpenCV

После того как компоненты Delphi-OpenCV установлены можно ознакомиться с примерами, которые вы можете найти в архиве. Кстати в примерах очень много комментариев на русском языке. Вот какие примеры здесь есть:

1. LibDemo – группа проектов с примерами использования некоторых функций и процедур. Путь к группе проектов — <PROJECT_ROOT>\samples\LibDemo\LibDemo.groupproj. Здесь есть примеры захвата видео с камеры, записи видео и изображений в файл и чтения из них, обработки изображений с помощью фильтров, поиска контуров, фигур и шаблонов на изображении (поиск шаблона, см на рисунке ниже).

2. MultiDemo – группа проектов с примерами использования алгоритмов обработки видео. Находится здесь: <PROJECT_ROOT>\samples\MultiDemo\MultiDemo.groupproj. Здесь я нашёл примеры захвата видео с IP-камеры (для эксперимента можете использовать адреса публичных IP-камер, список см. ниже), распознавания номера машины на изображении (см. рисунок ниже), распознавания лиц, обнаружение движений, отслеживание объекта и другие.


3. FFMPEG — примеры использования библиотеки кодеков FFMPEG. Группа проектов находится здесь: <PROJECT_ROOT>\samples\FFMpeg\FFMPEG.groupproj. Здесь я нашёл примеры проигрывателей (см. картинку снизу) и примеры обработки видео. Правда, некоторые примеры не захотели у меня работать из-за ошибки E2003 Undeclared identifier: ‘avcodec_alloc_frame’. Дело в том, что функция avcodec_alloc_frame запрещена и вместо неё нужно использовать функцию av_frame_alloc. Чтобы примеры заработали, просто замените avcodec_alloc_frame на av_frame_alloc. Аналогично, функцию avcodec_get_frame_defaults нужно заменить на av_frame_unref.

4. ComponentsDemo – группа проектов с примерами использования компонентов. Находится здесь: <PROJECT_ROOT>\samples\Components\ComponentsDemo.groupproj. Здесь есть примеры захвата видео с веб-камеры, IP-камеры (см. картинку снизу) или из файла, поиска шаблона на видео, запись видео с веб-камеры в файл и отслеживание объекта.

А вот список некоторых публичных IP-камер для экспериментов:

Байкал, Листвянка — rtmp://bm.isc.irk.ru/v2/v2
Екатеринбург, Плотинка — rtsp://80.78.116.125:1935/rtplive/plot_hd.stream

Екатеринбург, Зоопарк, слониха Даша — rtmp://80.78.116.125:1935/rtplive/zoo_ek_sd.stream
Екатеринбург, Площадь 1905 г. — rtmp://80.78.116.125:1935/rtplive/5goda_sd.stream
Соликамск, Соборная площадь — rtmp://80.78.116.125:1935/rtplive/solikamsk_hd.stream

Итог

Не думаю, что нужно ещё что-либо писать про использование библиотеки компьютерного зрения в Delphi. Примеров здесь большое количество, а документацию по библиотеке можно почитать на сайте OpenCV здесь. А если что не понятно по компонентам, то всегда можно посмотреть исходники.

Использование OpenCV в Delphi / Хабр

Так случилось, что я активно использую Delphi в своей работе (программирование по работе, собственные открытые и закрытые проекты) и вот мне понадобилось написать программу, использующую открытую библиотеку компьютерного зрения OpenCV. Что же делать, ведь официально OpenCV использовать в Delphi невозможно, а перебираться на C ради одной программы слишком долго.

Но нет ничего невозможного…

Немного поискав в интернете, я нашел несколько проектов по использованию OpenCV в Delphi.
Первый, второй, третий и наиболее свежий и удачный — четвертый, который я и взял за основу.

Проект на github мне показался интересным, реализовано много функций OpenCV, есть много примеров на Delphi, но проект заброшен автором и пришлось взяться за свой.

Все текущие наработки я выложил на code.google.com/p/opencv-delphi-new

В настоящий момент сделано:
1. Поддержка RAD Studio XE3.
2. Добавлены новые функции: cvFlip, cvClearMemStorage, cvCreateChildMemStorage, cvRectangle, cvRetrieveFrame, cvIntegral, cvGetPerspectiveTransform, cvWarpPerspective, cvCreateMat, cv2DRotationMatrix, cvWarpAffine, cvFindContours, cvHaarDetectObjects.

3. Добавлено 6 новых примеров:
FaceDetect — Пример детектирования лица в видеопотоке с использованием преобразования Хафа.
FindContours — Нахождение контуров изображения.
Integral — Интегральное изображение.
WarpAffine — Трансформация изображения — аффинные преобразования (Поворот изображения на произвольный угол).
WrapPrespective — Трансформация изображения — гомография (Перспективная трансформация).
MatchShapes — Поиск объекта на изображении по шаблону (Сравнение объектов по моментам их контуров).

В добавленных примерах я постарался подробно расписать все манипуляции для достяжения нужного результата.

Если кому-то будет интересна тема использования OpenCV в Delphi, то пишите мне на email или оставляйте комментарии.
Если тематика использования OpenCV в принципе интересна, то могу написать несколько статей, только напишите, какое направление использования OpenCV Вас интересует.

1. OpenCV шаг за шагом. Введение. / Компьютерное зрение / RoboCraft. Роботы? Это просто!


Оглавление
1. OpenCV шаг за шагом. Введение.

Про OpenCV (Open Source Computer Vision Library) было немного рассказано здесь.
Это библиотека, которая до 1-й версии разарабатывалась в Центре разработки программного обеспечения Intel (причём, российской командой в Нижнем Новгороде).
OpenCV написана на языке высокого уровня (C/C++) и содержит алгоритмы для: интерпретации изображений, калибровки камеры по эталону, устранение оптических искажений, определение сходства, анализ перемещения объекта, определение формы объекта и слежение за объектом, 3D-реконструкция, сегментация объекта, распознавание жестов и т.д.

Эта библиотека очень популярна за счёт своей открытости и возможности бесплатно использовать как в учебных, так и коммерческих целях.

Фактически, OpenCV – это набор типов данных, функций и классов для обработки изображений алгоритмами компьютерного зрения.

Основные модули библиотеки:

cxcore — ядро
* содержит базовые структуры данных и алгоритмы:
— базовые операции над многомерными числовыми массивами
— матричная алгебра, математические ф-ции, генераторы случайных чисел
— Запись/восстановление структур данных в/из XML
— базовые функции 2D графики

CV — модуль обработки изображений и компьютерного зрения
— базовые операции над изображениями (фильтрация, геометрические преобразования, преобразование цветовых пространств и т. д.)
— анализ изображений (выбор отличительных признаков, морфология, поиск контуров, гистограммы)

— анализ движения, слежение за объектами
— обнаружение объектов, в частности лиц
— калибровка камер, элементы восстановления пространственной структуры

Highgui — модуль для ввода/вывода изображений и видео, создания пользовательского интерфейса
— захват видео с камер и из видео файлов, чтение/запись статических изображений.
— функции для организации простого UI (все демо приложения используют HighGUI)

Cvaux — экспериментальные и устаревшие функции
— пространств. зрение: стерео калибрация, само калибрация
— поиск стерео-соответствия, клики в графах
— нахождение и описание черт лица

CvCam — захват видео
— позволяет осуществлять захват видео с цифровых видео-камер ( поддержка прекращена и в последних версиях этот модуль отсутствует )

Текущая (на момент правки статьи) стабильная версия 2.4.1.

Скачать библиотеку можно здесь:
http://sourceforge.net/projects/opencvlibrary/

В версии 2.2 структура библиотека реорганизована — теперь вместо больших универсальных модулей (cxcore, Cvaux, Highgui, Cvaux) библиотека OpenCV разделена на небольшие модули по функцианальному использованию:
opencv_core — ядро: базовые структуры, вычисления (математические функции, генерация псевдослучайных чисел, DFT, DCT, ввод/вывод в XML и т.п.)
opencv_imgproc — обработка изображений (фильтры, преобразования и т. д.).
opencv_highgui — простой UI, загрузка/сохранение изображений и видео.
opencv_ml — методы и модели машинного обучения (SVM, деревья принятия решений и т. д.).
opencv_features2d — различные дескрипторы (SURF).
opencv_video — анализ движения и отслеживание объектов (оптический поток, шаблоны движения, устранение фона).
opencv_objdetect — детектирование объектов на изображении (вейвлеты Хаара, HOG и т. д.).
opencv_calib3d — калибровка камеры, поиск стерео-соответстсвия и элементы обработки трехмерных данных.
opencv_flann — библиотека быстрого поиска ближайших соседей (FLANN).
opencv_contrib — сопутствующий код, еще не готовый для применения.
opencv_legacy — устаревший код, сохраненный ради обратной совместимости.
opencv_gpu — ускорение некоторых функций OpenCV за счет CUDA (NVidia).

Читать далее: 2. OpenCV шаг за шагом. Установка.

Книга про OpenCV:
Gary Bradski, Adrian Kaehler «Learning OpenCV. Computer vision with the OpenCV library.»

Ссылки
ru.wikipedia.org/wiki/OpenCV
opencv.org
docs.opencv.org
www.compvision.ru/forum/index.php?showforum=4

Автор: Vladimir (noonv), 2010-2011

Эксклюзивно для www.robocraft.ru
копирование на другие ресурсы и публикация
без разрешения автора запрещены.

Использование OpenCV в Delphi

Так случилось, что я активно использую Delphi в своей работе (программирование по работе, собственные открытые и закрытые проекты) и вот мне понадобилось написать программу, использующую открытую библиотеку компьютерного зрения OpenCV. Что же делать, ведь официально OpenCV использовать в Delphi невозможно, а перебираться на C ради одной программы слишком долго.

Но нет ничего невозможного…

Немного поискав в интернете, я нашел несколько проектов по использованию OpenCV в Delphi.
Первый, второй, третий и наиболее свежий и удачный — четвертый, который я и взял за основу.

Проект на github мне показался интересным, реализовано много функций OpenCV, есть много примеров на Delphi, но проект заброшен автором и пришлось взяться за свой.

Все текущие наработки я выложил на code.google.com/p/opencv-delphi-new/

В настоящий момент сделано:
1. Поддержка RAD Studio XE3.
2. Добавлены новые функции: cvFlip, cvClearMemStorage, cvCreateChildMemStorage, cvRectangle, cvRetrieveFrame, cvIntegral, cvGetPerspectiveTransform, cvWarpPerspective, cvCreateMat, cv2DRotationMatrix, cvWarpAffine, cvFindContours, cvHaarDetectObjects.
3. Добавлено 6 новых примеров:
FaceDetect — Пример детектирования лица в видеопотоке с использованием преобразования Хафа.
FindContours — Нахождение контуров изображения.
Integral — Интегральное изображение.
WarpAffine — Трансформация изображения — аффинные преобразования (Поворот изображения на произвольный угол).
WrapPrespective — Трансформация изображения — гомография (Перспективная трансформация).
MatchShapes — Поиск объекта на изображении по шаблону (Сравнение объектов по моментам их контуров).

В добавленных примерах я постарался подробно расписать все манипуляции для достяжения нужного результата.

Если кому-то будет интересна тема использования OpenCV в Delphi, то пишите мне на email или оставляйте комментарии.
Если тематика использования OpenCV в принципе интересна, то могу написать несколько статей, только напишите, какое направление использования OpenCV Вас интересует.

Автор: Sleuthhound

Источник

НОУ ИНТУИТ | Лекция | Начало работы с библиотекой OpenCV

Аннотация: В лекции приводятся: обзор библиотеки OpenCV, описание программ на C/C++ и Python.

Презентацию к лекции Вы можете скачать здесь.

1. Начало работы с библиотекой OpenCV

Цель настоящего раздела – создать правильное впечатление о возможностях библиотеки OpenCV (http://opencv.org) и дать начальный толчок для дальнейшего его изучения.

1.1. Обзор библиотеки

OpenCV – de facto самая популярная библиотека компьютерного зрения. Она написана на C/C++, ее исходный код открыт. библиотека включает более 1000 функций и алгоритмов. Она разрабатывается c 1998 г., сначала в компании Интел, теперь в Itseez при активном участии сообщества. О высокой популярности библиотеки свидетельствует количество загрузок, их более 6000000 загрузок (без учета svn/git трафика).

Существуют библиотеки, более продвинутые по функциональности, например, Halcon. Есть библиотеки более специализированные, делающие акцент на какой-либо конкретной задаче, например, libmv. OpenCV – самая большая библиотека по широте тематики.

Библиотека распространяется по лицензии BSD, что означает, что ее можно свободно и бесплатно использовать как в открытых проектах с открытым кодом, так и в закрытых, коммерческих проектах. Библиотеку не обязательно копировать целиком в свой проект, можно использовать куски кода. Единственное требование лицензии – наличие в сопровождающих материалах копии лицензии OpenCV.

Из-за либеральной лицензии библиотека используется многими компаниями, организациями, университетами, например, NVidia, Willow Garage, Intel, Google, Stanford University. Компании NVidia и WillowGarage частично спонсируют ее разработку.

Есть основание думать, что не все компании, использующие OpenCV, афишируют это. Приведем небольшой перечень известных авторам проектов, в которых используется OpenCV:

  • Система зрения робота PR2, разработанного компанией WillowGarage (www.willowgarage.com). Проект PR2 нацелен на решение сложной задачи – создание платформы для персональной робототехники.
  • Аудио-визуальная инсталляция в Музее Современного Искусства (Сан-Франциско).
  • Контроль качества монет, изготавливаемых Центробанком Китая.
  • Курсы компьютерного зрения в Стэнфорде.
  • Панорамы улиц в картах Google.

Многомерная архитектура проекта представлена на рис. 4.1. Библиотека состоит из 16 модулей. Реализованы около 1000 алгоритмов. Функциональность доступна на разных языках: C, C++, Python, CUDA, Java. Поддерживаются основные операционные системы: MS Windows, Linux, Mac, Android, iOS. Есть возможность использования сторонних библиотек, например, для работы с устройством Kinect (OpenNI), разработки параллельных программ (TBB) и др.

Проект использует систему непрерывной интеграции. Каждую ночь последние рабочие версии OpenCV скачиваются из репозитория и компилируются на 50 различных конфигурациях (разные операционные системы, разные платформы, разные параметры и т. д.), после чего запускаются регрессионные тесты. Например, проводится реальное тестирование на Android-планшетах.


Рис. 4.1.

Основные модули библиотеки можно отнести к 4 группам (разделам):

  • Модули core, highgui, реализующие базовую функциональность (базовые структуры, математические функции, генераторы случайных чисел, линейная алгебра, быстрое преобразование Фурье, ввод/вывод изображений и видео, ввод/вывод в форматах XML, YAML и др.).
  • Модули imgproc, features2d для обработки изображений (фильтрация, геометрические преобразования, преобразование цветовых пространств, сегментация, обнаружение особых точек и ребер, контурный анализ и др).
  • Модули video, objdetect, calib3d (калибровка камеры, анализ движения и отслеживание объектов, вычисление положения в пространстве, построение карты глубины, детектирование объектов, оптический поток).
  • Модуль ml, реализующий алгоритмы машинного обучения (метод ближайших соседей, наивный байесовский классификатор, деревья решений, бустинг, градиентный бустинг деревьев решений, случайный лес, машина опорных векторов, нейронные сети и др.).

Обратим внимание на поддержку работы с xml-файлами. Результаты промежуточных вычислений можно сохранять в xml-файлах, а затем их прочитать, например, в другой программе, что облегчает разработку алгоритма по частям, работу над алгоритмом целой командой.

Заметим, что библиотека OpenCV реализует, как правило, только базовые операции, используемые в компьютерном зрении. Таким образом, ее можно рассматривать как в целом низкоуровневую библиотеку компьютерного зрения. Для решения серьезных задач необходимо на основе предоставленных библиотекой кирпичиков создавать свои сложные приложения.

На рисунке ниже представлена общая схема типичного приложения, предназначенного для решения той или иной задачи компьютерного зрения (конечно, не все приложения подпадают под эту схему).


Рис. 4.2.

Все начинается с захвата изображений (модуль highgui). Вы читаете изображение из файла или читаете видео с сетевой камеры через сетевой протокол.

Далее осуществляется предварительная обработка (модуль imgproc), такая, как устранение шума, выравнивание яркости, контраста, выделение и удаление бликов, теней. Например, один и тот же объект при разном освещении выглядит по-разному. В ярком свете красная машина, движение которой, необходимо отслеживать, будет ярко-оранжевой. В пасмурную погоду та же машина будет выглядеть красно-розовой. В этом случае на изображении необходимо выполнить выравнивание цветов. Предобработка может быть простой, но может заключать в себе целую сложную технологию.

Следующий этап – выделение особенностей (модули imgproc, features2d). Например, в задаче слежения за объектом это может быть поиск специальных точек на объекте, за которыми легко наблюдать; для задачи детектирования (т. е. обнаружения на изображении) лица – вычисления описания каждого пиксела.

Далее происходит детектирование интересующих нас объектов, выделение значимых частей, сегментация изображения (модули imgproc, objdetect). Если, например, камера неподвижна, а изображение подвижное, можно использовать алгоритмы вычитания фона.

После этого вы решаете основную задачу, такую, как вычисление расположения объекта в 3d, реконструкцию 3d структуры, анализ структуры, регистрацию и т. п. (модули calib3d, contrib, video, stitching, videostab, ml). Например в задаче склейки панорам изображений – это сопоставление частей разных кадров, определение нужного преобразования. В задаче видеонаблюдения это восстановление траекторий объектов и т. д.

В конце происходит распознавание и принятие конкретных решений (модуль ml). Например, в системе видеонаблюдения: появился нежелательный объект в кадре или нет. В задаче детектирования текста – детектирован текст, что именно за текст и т. д.

Вот вкратце базовое описание основных компонентов OpenCV и схемы работы с библиотекой. Теперь рассмотрим библиотеку более подробно.

Параллельная обработка видео с помощью OpenCV

Для работы понадобится установить следующие пакеты:

OpenCV – cамая популярная библиотека компьютерного зрения – её мы будем использовать для чтения и записи видеофайлов. Пример использования недавно публиковался в Библиотеке программиста. Чтобы установить OpenCV, используйте pip:

        pip3 install opencv-python
    

FFmpeg – кроссплатформенное ПО для записи, конвертации и стриминга аудио и видео. Мы будем использовать FFmpeg для объединения нескольких видеофайлов. Страница загрузки.

Давайте импортируем необходимые библиотеки:

        import cv2 as cv
import time
import subprocess as sp
import multiprocessing as mp
from os import remove
from xailient import dnn
    

Подробная информация об используемых библиотеках:

  • cv2: библиотека OpenCV, чтобы читать и писать видеофайлы;
  • time: получаем текущее время для расчета времени выполнения кода;
  • subprocess: запускаем новые процессы, подключаемся к их каналам input/output/error и забираем их коды возврата.
  • multiprocessing: распараллеливаем выполнение функции для нескольких входных значений и распределяем входные данные между процессами;
  • xailient: библиотека для распознавания лиц. Вы можете использовать для этой цели любую библиотеку, например face_recognition, но в нашем примере используется эта.

Начнем с метода обработки видео в одном процессе. Именно так мы обычно читаем видеофайл, обрабатываем каждый кадр и записываем выходные кадры обратно на диск.

        def process_video():
    # Читаем файл с видео
    cap = cv.VideoCapture(file_name)

    # Получаем высоту, ширину и количество кадров в видео
    width, height = (
            int(cap.get(cv.CAP_PROP_FRAME_WIDTH)),
            int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))
        )
    fps = int(cap.get(cv.CAP_PROP_FPS))

    # Определяем кодек и создаем объект VideoWriter
    fourcc = cv.VideoWriter_fourcc('m', 'p', '4', 'v')
    out = cv.VideoWriter()
    output_file_name = "output_single.mp4"
    out.open(output_file_name, fourcc, fps, (width, height), True)

    try:
        while cap.isOpened():
            ret, frame = cap.read()
            if not ret:
                break
            
            im = frame
            # Выполняем распознавание лиц в кадре
            _, bboxes = detectum.process_frame(im, THRESHOLD)

            # Цикл по списку (если он пуст, то это пропускаем) и наложение зеленых полей            for i in bboxes:
                cv.rectangle(im, (i[0], i[1]), (i[2], i[3]), (0, 255, 0), 3)
            
            # Рисуем рамку
            out.write(im)
    except:
        # Высвобождаем ресурсы
        cap.release()
        out.release()
        

    # Высвобождаем ресурсы
    cap.release()
    out.release()
    

Давайте создадим еще одну функцию, которая вызывает видеопроцессор, фиксирует время начала и конца, вычисляет время, необходимое для выполнения обработки и количество обработанных кадров в секунду.

        def single_process():
    print("Обработка видео с использованием одного процесса...")
    start_time = time.time()
    process_video()
    end_time = time.time()
    total_processing_time = end_time - start_time
    print("Время: {}".format(total_processing_time))
    print("FPS : {}".format(frame_count/total_processing_time))
    
file_name = "input_video.mp4"
output_file_name = "output.mp4"
width, height, frame_count = get_video_frame_details(file_name)
print("Количество кадров = {}".format(frame_count))
print("Ширина = {}, Длина = {}".format(width, height))
single_process()
    

Теперь определим другую функцию, использующую многопроцессорную обработку:

        def process_video_multiprocessing(group_number):
    # Читаем файл с видео
    cap = cv.VideoCapture(file_name)

    cap.set(cv.CAP_PROP_POS_FRAMES, frame_jump_unit * group_number)

    # Получаем высоту, ширину и количество кадров в видео
    width, height = (
            int(cap.get(cv.CAP_PROP_FRAME_WIDTH)),
            int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))
        )
    no_of_frames = int(cap.get(cv.CAP_PROP_FRAME_COUNT))
    fps = int(cap.get(cv.CAP_PROP_FPS))
    proc_frames = 0

    # Определяем кодек и создаем объект VideoWriter
    fourcc = cv.VideoWriter_fourcc('m', 'p', '4', 'v')
    out = cv.VideoWriter()
    output_file_name = "output_multi.mp4"
    out.open("output_{}.mp4".format(group_number), fourcc, fps, (width, height), True)
    try:
        while proc_frames < frame_jump_unit:
            ret, frame = cap.read()
            if not ret:
                break

            im = frame
            # Выполняем распознавание лиц в каждом кадре
            _, bboxes = detectum.process_frame(im, THRESHOLD)

            # Цикл по списку (если он пуст, то это пропускаем) и наложение зеленых полей 
            for i in bboxes:
                cv.rectangle(im, (i[0], i[1]), (i[2], i[3]), (0, 255, 0), 3)
            
            # Рисуем рамку
            out.write(im)

            proc_frames += 1
    except:
        # Высвобождаем ресурсы
        cap.release()
        out.release()

    # Высвобождаем ресурсы
    cap.release()
    out.release()
    

В приведенной функции описана обработка, которая обычно выполняется с помощью одного процесса, но теперь она делится поровну между общим количеством процессоров, доступных на исполняющем устройстве.

Если существует 4 процесса, а общее количество кадров в обрабатываемом видео равно 1000, то каждый процесс получает 250 кадров для обработки, которые выполняются параллельно. В итоге каждый процесс создаст отдельный выходной файл с видео. Чтобы объединить эти файлики мы будем использовать ffmpeg.

        def combine_output_files(num_processes):
    # Создаем список выходных файлов и складываем имена файлов в текстовый файл
    list_of_output_files = ["output_{}.mp4".format(i) for i in range(num_processes)]
    with open("list_of_output_files.txt", "w") as f:
        for t in list_of_output_files:
            f.write("file {} \n".format(t))

    # Используем ffmpeg для объединения выходных видеофайлов
    ffmpeg_cmd = "ffmpeg -y -loglevel error -f concat -safe 0 -i list_of_output_files.txt -vcodec copy " + output_file_name
    sp.Popen(ffmpeg_cmd, shell=True).wait()

    # Удаляем временные файлы
    for f in list_of_output_files:
        remove(f)
    remove("list_of_output_files.txt")
    

Теперь создаем конвейер для запуска многопроцессорной обработки видео, расчета времени выполнения и кадров, обрабатываемых в секунду.

        def multi_process():
    print("Обработка видео с использованием {} процессов...".format(num_processes))
    start_time = time.time()

    # Параллельное выполнение функции с несколькими входными значениями
    p = mp.Pool(num_processes)
    p.map(process_video_multiprocessing, range(num_processes))

    combine_output_files(num_processes)

    end_time = time.time()

    total_processing_time = end_time - start_time
    print("Время: {}".format(total_processing_time))
    print("FPS : {}".format(frame_count/total_processing_time))

file_name = "input.mp4"
output_file_name = "output.mp4"
width, height, frame_count = get_video_frame_details(file_name)
print("Количество кадров = {}".format(frame_count))
print("Ширина= {}, Высота = {}".format(width, height))
num_processes = mp.cpu_count()
print("Количество процессоров: " + str(num_processes))
frame_jump_unit =  frame_count// num_processes
multi_process()
    

Эксперимент проводился на Lenovo Yoga 920 с Ubuntu18.04. Количество доступных на устройстве логических процессоров – 8шт.

Из этого эксперимента мы можем сделать вывод, что при использовании всех ядер обрабатывается в 2 раза больше кадров в секунду. Чем больше процессоров на тестовой машине, тем больше можно реализовать процессов, и тем быстрее пройдет процесс обработки.

Использование OpenCV в Delphi

Создатели библиотеки компьютерного зрения OpenCV позаботились о разработчиках, которые программируют на C ++, C, Python и Java, ведь для этих языков есть официальные интерфейсы. А что же делать Delphi-разработчикам? На помощь приходит неофициальный проект Delphi-OpenCV, созданный и поддерживаемый российскими разработчиками, который предоставляет обёртки для библиотеки OpenCV. Давайте пробовать, насколько или сложно, установить, настроить и использовать OpenCV в Delphi.

По сути Delphi-OpenCV — это набор заголовочных файлов переведенных на Delphi + компоненты для среды разработки Delphi на их основе. На момент написания статьи, обёртки написаны для OpenCV версии 2.4.11 , поддерживаются Delphi 2010 Delphi 10.1 Berlin . Проект Delphi-OpenCV бесплатный, имеет открытые исходные коды и опубликованные на сайтах GitHub и SourceForge. Там же указаны кошельки авторов проекта, и если вы хотите добавить поддержку или выразить благодарность, вы можете это сделать материально.

Установка и настройка Delphi-OpenCV

Прежде всего, скачайте архив с файлами проекта Delphi-OpenCV отсюда. Затем приготовьте следующие файлы необходимые для полноценной работы OpenCV:

  1. Файлы распространяемых пакетов Visual C ++ для Visual Studio 2013 . Найти их можно в архиве Delphi-OpenCV: в папке redist \ VC2013x86 — файлы для 32-битной Windows и в папке redist \ VC2013x64 — для 64-битной. Вот какие файлы понадобятся: msvcp120.dll, msvcr120.dll, msvcp120d.dll и msvcr120d.dll.
  2. Библиотеки кодеков FFMPEG для Windows , скачать которые можно здесь. Скачивать нужно версию Shared, т.к. в ней есть нужные файлы .dll. Из скачанного архива нам нужны все файлы .dll и папки bin, такие как avcodec-57.dll, avdevice-57.dll, avfilter-6.dll, avformat-57.dll и т.д.
  3. Библиотека OpenCV , скачать которую можно здесь. После распаковки архива вам понадобятся .dll файлы из папок \ build \ x64 \ vc12 \ bin (здесь 64-битные файлы) и \ build \ x86 \ vc12 \ bin (здесь 32-битные файлы), а если точнее, то файлы с именами , оканчива своих на 2411.dll или 2411d.dll.
  4. Некоторым примерам (FFMPEG) требуются библиотеки SDL 2.0 и SDL 1.2 (файлы SDL.dll и SDL2.dll), скачать которые можно здесь.

Скопируйте все перечисленные выше файлы в следующие папки:

  1. Если у вас 32-битная Windows, скопируйте 32-битные файлы в папку C: \ Windows \ System32 \.
  2. Если у вас 64-битная Windows, то:
    1. скопируйте 64-битные файлы в папку C: \ Windows \ System32 \, если будете разрабатывать 64-битные приложения;
    2. скопируйте 32-битные файлы в папку C: \ Windows \ SysWOW64 \, если будете разрабатывать 32-битные приложения.

Файлы распространяемых пакетов Visual C ++ для Visual Studio 2013 могут быть установлены автоматически с помощью дистрибутива, который можно скачать здесь.

После того, как все файлы на местах, распакуйте архив с файлами Delphi-OpenCV в удобное для вас место (у меня это C: \ Projects \ OpenCV), пропишите пути к распакованным папкам в среде Delphi. Для этого закройте все проекты, если они у вас открыты (пункт меню «Файл -> Закрыть все») и откройте диалог настроек (пункт меню «Инструменты -> Параметры.. »). В диалоге открытия редактор путей («Параметры среды -> Параметры Delphi -> Библиотека -> Путь к библиотеке:») и добавить в список пути к следующему папкам:

\ source
\ source \ utils
\ source \ component
\ source \ sdl
\ source \ sdl2
\ openPROJECT_ROOT>
\ источник \ ffmpeg
<КОРНЕВОЙ_ПРОЕКТ> \ ресурс \ facedetectxml

где — это папка, куда вы распаковали архив.Т.е. у меня папка \ source будет иметь следующий вид: C: \ Projects \ OpenCV \ source.

Затем откройте, откомпилируйте и установите следующие проекты (первый проект в списке нужно только откомпилировать):

\ source \ component \ DelphiXX \ OpenCVXXX.dpk
\ source \ component \ DelphiXX \ dclCommonOpenCVXXX.dpk
\ source \ component \ DelphiXpen.dkVCLVECT> \ source \ component \ DelphiXXpen \ dclVECT \ DelphiXX \ dclFMXOpenCVXXX.dpk
<КОРНЕВОЙ_ПРОЕКТ> \ источник \ компонент \ DelphiXX \ dclFFMSourceXXX.dpk


где — это папка, куда вы распаковали архив, DelphiXX — это папка для вашей версии Delphi (я использую Embarcadero RAD Studio 10 Seattle, поэтому у меня это будет папка Delphi 10 Seattle), XXX — это номер версии среды разработки (в Delphi 10 Seattle номер версии 23.0, поэтому вместо XXX у меня будет 230). Т.е. для моего случая пути к проектам будут следующие:

C: \ Projects \ OpenCV \ source \ component \ Delphi 10 Seattle \ OpenCV230.dpk
C: \ Projects \ OpenCV \ source \ component \ Delphi 10 Seattle \ dclCommonOpenCV230.dpk
C: \ Projects \ OpenCV \ source \ component \ Delphi 10 Seattle \ dclVCLOpenCV230.dpk
C: \ Projects \ OpenCV \ source \ component \ Delphi 10 Сиэтл \ dclFMXOpenCV230.dpk
C: \ Projects \ OpenCV \ source \ component \ Delphi 10 Seattle \ dclFFMSource230.dpk

Порядок установки не меняйте.

Примеры Delphi-OpenCV

После того как компоненты Delphi-OpenCV установлены можно ознакомиться с примерами, которые вы можете найти в архиве.Кстати в примерах очень много комментариев на русском языке. Вот какие примеры здесь есть:

1. LibDemo — группа проектов с примерами использования некоторых функций и процедур. Путь к группе проектов — \ samples \ LibDemo \ LibDemo.groupproj. Здесь есть примеры захвата видео с камеры, записи видео и изображений в файл и чтение из них, поиск обработки изображений с помощью фильтров, поиск контуров, фигур и шаблонов на изображении (поиск обработки шаблона, см на рисунке ниже).

2. MultiDemo — группа проектов с примерами использования алгоритмов обработки видео. Находится здесь: \ samples \ MultiDemo \ MultiDemo.groupproj. Здесь я нашёл пример захвата видео с IP-камеры (для эксперимента можете использовать публичных IP-камер, список см. Ниже), распознавания номера машины на изображении (см. Рисунок ниже), распознавания лиц, обнаружение движений, отслеживание объекта и другие.


3. FFMPEG — примеры использования библиотеки кодеков FFMPEG. Группа проектов находится здесь: \ samples \ FFMpeg \ FFMPEG.groupproj. Здесь я нашёл примеры проигрывателя (см. Картинку снизу) и примеры обработки видео. Правда, некоторые примеры не захотели у меня работать из-за ошибки E2003 Необъявленный идентификатор: ‘avcodec_alloc_frame’. Дело в том, что функция avcodec_alloc_frame запрещена и вместо нее нужно использовать функцию av_frame_alloc. Чтобы примеры заработали, просто замените avcodec_alloc_frame на av_frame_alloc.Аналогично функцию avcodec_get_frame_defaults нужно заменить на av_frame_unref.

4. ComponentsDemo — группа проектов с примерами использования компонентов. Находится здесь: \ samples \ Components \ ComponentsDemo.groupproj. Здесь есть пример захвата видео с веб-камеры, IP-камеры (см. Картинку снизу) или из файла, поиск шаблона на видео, запись видео с веб-камеры в файл и отслеживание объекта.

А вот список публичных IP-камер для экспериментов:

Байкал, Листвянка — rtmp: // bm.isc.irk.ru/v2/v2
Екатеринбург, Плотинка — rtsp: //80.78.116.125: 1935 / rtplive / plot_hd.stream
Екатеринбург, Зоопарк, слониха Даша — rtmp: //80.78.116.125: 1935 / rtplive / zoo_ek_sd .stream
Екатеринбург, Площадь 1905 г. — rtmp: //80.78.116.125: 1935 / rtplive / 5goda_sd.stream
Соликамск, Соборная площадь — rtmp: //80.78.116.125: 1935 / rtplive / solikamsk_hd.stream

Итог

Не думаю, что нужно ещё что-либо писать про использование библиотеки компьютерного зрения в Delphi.Примеров здесь большое количество, документацию по библиотеке можно почитать на сайте OpenCV здесь. А если что не понятно по компонентам, то всегда можно посмотреть исходники.

.

Использование OpenCV в Delphi / Хабр

Так случилось, что я активно использую Delphi в работе (программирование по работе, собственной открытые и закрытые проекты) и вот мне понадобилось написать программу, использующую открытую библиотеку компьютерного зрения OpenCV. Что же делать, ведь официально OpenCV использовать в Delphi невозможно, а перебираться на C ради одной программы слишком долго.

Но нет ничего невозможного…

Немного поискав в интернете, я нашел несколько проектов по использованию OpenCV в Delphi.
Первый, второй, третий и наиболее свежий и удачный — четвертый, который я и взял за основу.

Проект на github мнеался интересным, реализовано много функций OpenCV, есть много примеров на Delphi, но проект заброшен автором и пришлось взяться за свой.

Все текущие наработки я выложил на code.google.com/p/opencv-delphi-new

В настоящий момент сделано:
1. Поддержка RAD Studio XE3.
2. Добавлены новые функции: cvFlip, cvClearMemStorage, cvCreateChildMemStorage, cvRectangle, cvRetrieveFrame, cvIntegral, cvGetPerspectiveTransform, cvWarpPerspective, cvCreateMat, cv2DRffabjects, cv2DRffabjects, cv2DRffabjects, cv2DRffovers.
3. Добавлено 6 новых примеров:
. FaceDetect — Пример детектирования лица в видеопотоке с использованием преобразования Хафа.
FindContours — Нахождение контуров изображения.
Integral — Интегральное изображение.
WarpAffine — Трансформация изображения — аффинные преобразования (Поворот изображения на произвольный угол).
WrapPrespective — Трансформация изображения — гомография (Перспективная трансформация).
MatchShapes — Поиск объекта на изображении по шаблону (Сравнение объектов по моментм их контуров).

В добавленных примерах я постарался подробно расписать все манипуляции для получения нужного результата.

Если кому-то будет интересна тема использования OpenCV в Delphi, то пишите мне на электронную почту или оставляйте комментарии.
Если тематика использования OpenCV в принципе интересна, то могу написать несколько статей, только напишите, какое направление использования OpenCV Вас интересует.

.

1. OpenCV шаг за шагом. Введение. / Компьютерное зрение / RoboCraft. Роботы? Это просто!


Оглавление
1. OpenCV шаг за шагом. Введение.

Про OpenCV (библиотека компьютерного зрения с открытым исходным кодом) было немного рассказано здесь.
Это библиотека, которая до 1-й версии разарабатывалась в Центре разработки программного обеспечения Intel (причём, российской командой в Нижнем Новгороде).
OpenCV написана на языке уровня (C / C ++) и содержит алгоритмы: интерпретации изображений, калибровки камеры по эталону, устранение оптических искажений, определение формы, анализ перемещения объекта, определение объекта и слежение за объектом, 3D-реконструкция, сегментация объекта, распознавание жестов и т.д.

Эта библиотека очень популярна за счёт своей открытости и возможности бесплатно использовать как в учебных, так и коммерческих целях.

Фактически, OpenCV — это набор типов данных, функций и классов для обработки изображений алгоритмами компьютерного зрения.

Основные модули библиотеки:

cxcore — ядро ​​
* содержит базовые структуры данных и алгоритмы:
— базовые операции над многомерными числовыми массивами
— матричная алгебра, математические ф-ции, генераторы случайных чисел
— Запись / восстановление структур данных в / из XML
— базовые функции 2D графики

CV — модуль обработки изображений и компьютерного зрения
— базовые операции над изображениями (фильтрация, геометрические преобразования, преобразование цветовых пространств и т.д.)
— анализ изображений (выбор отличительных признаков, морфология, поиск контуров, гистограммы)
— анализ движения, слежение за объектами
— обнаружение объектов, в частности лиц
— калибровка камеры, элементы восстановления пространственной структуры

Highgui — модуль для ввода / вывода изображений и видео, создания пользовательского интерфейса
— захват видео с камер и из видео файлов, чтение / запись статических изображений.
— функции для простого пользовательского интерфейса (все демо приложения используют HighGUI)

Cvaux — экспериментальные и устаревшие функции
— пространств. зрение: стерео калибрация, само калибрация
— поиск стерео-соответствия, клики в графах
— нахождение и описание черт лица

CvCam — захват видео
— позволяет захватить видео с цифровых видео-камер ( поддержка прекращения и последних версийх этот модуль отсутствует )

Текущая (на момент правки статьи) стабильная версия 2.4.1.

Скачать библиотеку можно здесь:
http://sourceforge.net/projects/opencvlibrary/

В структура версии 2.2 библиотека реорганизована — теперь вместо больших универсальных модулей (cxcore, Cvaux, Highgui, Cvaux) библиотеки OpenCV разделена на небольшие модули по функцианальному использованию:
opencv_core — ядро: базовые структуры, вычисления (математические функции, генерация псевдослучайных чисел, DFT, DCT, ввод / вывод в XML и т.п.)
opencv_imgproc — обработка изображений (фильтры, преобразования и т. д.).
opencv_highgui — простой интерфейс, загрузка / сохранение изображений и видео.
opencv_ml — методы и модели машинного обучения (SVM, деревья принятия решений и т. Д.).
opencv_features2d — различные дескрипторы (SURF).
opencv_video — анализ движения и отслеживание объектов (оптический поток, шаблоны движения, устранение фона).
opencv_objdetect — детектирование объектов на изображении (вейвлеты Хаара, HOG и т.д.).
opencv_calib3d — калибровка камеры, поиск стерео-соответстсвия и элементы обработки трехмерных данных.
opencv_flann — библиотека быстрого поиска ближайших соседей (FLANN).
opencv_contrib — сопутствующий код, еще не готовый для применения.
opencv_legacy — устаревший код, сохраненный ради обратной совместимости.
opencv_gpu — ускорение некоторых функций OpenCV за счет CUDA (NVidia).

Читать далее: 2.OpenCV шаг за шагом. Установка.

Книга про OpenCV:
Гэри Брадски, Адриан Келер «Изучение OpenCV. Компьютерное зрение с библиотекой OpenCV. »

Ссылки
ru.wikipedia.org/wiki/OpenCV
opencv.org
docs.opencv.org
www.compvision.ru/forum/index.php?showforum=4

Автор: Владимир ( noonv ), 2010-2011

Эксклюзивно для www.robocraft.ru
копирование на другие ресурсы и публикация
без разрешения автора запрещены.

.

Использование OpenCV в Delphi

Так случилось, что я активно использую Delphi в своей работе (программирование по работе, собственные открытые и закрытые проекты) Так случилось, что мне понадобилось написать программу, использующую открытую библиотеку компьютерного зрения OpenCV. Что же делать, ведь официально OpenCV использовать в Delphi невозможно, а перебираться на C ради одной программы слишком долго.

Но нет ничего невозможного…

Немного поискав в интернете, я нашел несколько проектов по использованию OpenCV в Delphi.
Первый, второй, третий и наиболее свежий и удачный — четвертый, который я и взял за основу.

Проект на github мнеался интересным, реализовано много функций OpenCV, есть много примеров на Delphi, но проект заброшен автором и пришлось взяться за свой.

Все текущие наработки я выложил на code.google.com/p/opencv-delphi-new/

В настоящий момент сделано:
1. Поддержка RAD Studio XE3.
2. Добавлены новые функции: cvFlip, cvClearMemStorage, cvCreateChildMemStorage, cvRectangle, cvRetrieveFrame, cvIntegral, cvGetPerspectiveTransform, cvWarpPerspective, cvCreateMat, cvWarpPerspective, cvCreateMat, cv2
3. Добавлено 6 новых примеров:
FaceDetect — Пример детектирования лица в видеопотоке с использованием преобразования Хафа.
FindContours — Нахождение контуров изображения.
Integral — Интегральное изображение.
WarpAffine — Трансформация изображения — аффинные преобразования (Поворот изображения на произвольный угол).
WrapPrespective — Трансформация изображения — гомография (Перспективная трансформация).
MatchShapes — Поиск объекта на изображении по шаблону (Сравнение объектов по моментм их контуров).

В добавленных примерах я постарался подробно расписать все манипуляции для получения нужного результата.

Если кому-то будет интересна тема использования OpenCV в Delphi, то пишите мне на электронную почту или оставляйте комментарии.
Если тематика использования OpenCV в принципе интересна, то могу написать несколько статей, только напишите, какое направление использования OpenCV Вас интересует.

Автор: Sleuthhound

Источник

.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *