Рейтинг@Mail.ru

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

Автор: Alex. Опубликовано в Программирование . просмотров: 6429

Рейтинг:  5 / 5

Звезда активнаЗвезда активнаЗвезда активнаЗвезда активнаЗвезда активна
 

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

Использование 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.

Прописываем пути к библиотеке OpenCV в Delphi

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

<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. Здесь есть примеры захвата видео с камеры, записи видео и изображений в файл и чтения из них, обработки изображений с помощью фильтров, поиска контуров, фигур и шаблонов на изображении (поиск шаблона, см на рисунке ниже).

Пример поиска шаблона на изображении с помощью OpenCV в Delphi

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

Распознавания номера машины на изображении с помощью библиотеки OpenCV в Delphi


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.

Пример создания проигрывателя с помощью библиотек FFMPEG в Delphi

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

Пример захвата изображения с IP-камеры с помощью OpenCV в Delphi

А вот список некоторых публичных 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 здесь. А если что не понятно по компонентам, то всегда можно посмотреть исходники.

Tags: OpenCV Учебники по программированию Delphi

Комментарии   

albionseo
0 #1 albionseo 02.10.2017 19:29
у меня не получается, версия делфи берлин, она в архиве есть, открываю RAD Studio 10.1 Berlin.groupproj
пробовал и по отдельности дпк, там кстати файлы отличаются, видимо из за версии, жму скомпилировать все, на втором дпк ошибка, пишет нехватает файла libavcodec
при попытке установить пишет что нет бпл файлов, хотя в папке я их вижу
уже раз 10 перепробывал, качал все скидывал, хз, что то на берлине нужно делать подругому
Цитировать
Alex
0 #2 Alex 06.10.2017 13:17
Цитирую albionseo:
у меня не получается, версия делфи берлин, она в архиве есть, открываю RAD Studio 10.1 Berlin.groupproj
пробовал и по отдельности дпк, там кстати файлы отличаются, видимо из за версии, жму скомпилировать все, на втором дпк ошибка, пишет нехватает файла libavcodec
при попытке установить пишет что нет бпл файлов, хотя в папке я их вижу
уже раз 10 перепробывал, качал все скидывал, хз, что то на берлине нужно делать подругому

Они просто теперь стали использовать заголовочные файлы библиотеки FFmpeg с сайта www.delphiffmpeg.com . Вам нужно их самостоятельно скачать с этого сайта, затем скопировать в папку \source\ffmpeg\headers и прописать путь к этой папке в Library Path.
Цитировать
albionseo
0 #3 albionseo 06.10.2017 13:20
да уже разобрался, с 50 попытки получилось, там еще c dll что то не то было, вобщем, кто найдет данный пост, посмотрите сперва VisualLab там есть компоненты под делфи на том же openvc
Цитировать
Alex
0 #4 Alex 06.10.2017 13:22
Или вместо прописывания путей, включите файлы в проект. Тогда файл проекта изменится так:

Код:package dclFFMSource240;

{$R *.res}
{$R 'dclFFMSource.res'}
{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users}
{$ALIGN 8}
{$ASSERTIONS ON}
{$BOOLEVAL OFF}
{$DEBUGINFO OFF}
{$EXTENDEDSYNTAX ON}
{$IMPORTEDDATA ON}
{$IOCHECKS ON}
{$LOCALSYMBOLS ON}
{$LONGSTRINGS ON}
{$OPENSTRINGS ON}
{$OPTIMIZATION OFF}
{$OVERFLOWCHECKS OFF}
{$RANGECHECKS OFF}
{$REFERENCEINFO ON}
{$SAFEDIVIDE OFF}
{$STACKFRAMES ON}
{$TYPEDADDRESS OFF}
{$VARSTRINGCHECKS ON}
{$WRITEABLECONST OFF}
{$MINENUMSIZE 1}
{$IMAGEBASE 0000}
{$DEFINE DEBUG}
{$ENDIF IMPLICITBUILDING}
{$DESCRIPTION 'OpenCV FFMPEG component'}
{$IMPLICITBUILD ON}

requires
rtl;

contains
libswscale in '..\..\ffmpeg\headers\libswscale.pas',
FFTypes in '..\..\ffmpeg\headers\FFTypes.pas',
libavutil_log in '..\..\ffmpeg\headers\libavutil_log.pas',
libavutil_opt in '..\..\ffmpeg\headers\libavutil_opt.pas',
libavutil_timestamp in '..\..\ffmpeg\headers\libavutil_timestamp.pas',
libavutil_time in '..\..\ffmpeg\headers\libavutil_time.pas',
libavutil_samplefmt in '..\..\ffmpeg\headers\libavutil_samplefmt.pas',
libavutil_rational in '..\..\ffmpeg\headers\libavutil_rational.pas',
libavutil_pixfmt in '..\..\ffmpeg\headers\libavutil_pixfmt.pas',
libavutil_pixdesc in '..\..\ffmpeg\headers\libavutil_pixdesc.pas',
libavutil_parseutils in '..\..\ffmpeg\headers\libavutil_parseutils.pas',
libavutil_motion_vector in '..\..\ffmpeg\headers\libavutil_motion_vector.pas',
libavutil_mem in '..\..\ffmpeg\headers\libavutil_mem.pas',
libavutil_md5 in '..\..\ffmpeg\headers\libavutil_md5.pas',
libavutil_mathematics in '..\..\ffmpeg\headers\libavutil_mathematics.pas',
libavutil_imgutils in '..\..\ffmpeg\headers\libavutil_imgutils.pas',
libavutil_frame in '..\..\ffmpeg\headers\libavutil_frame.pas',
libavutil_file in '..\..\ffmpeg\headers\libavutil_file.pas',
libavutil_fifo in '..\..\ffmpeg\headers\libavutil_fifo.pas',
libavutil_eval in '..\..\ffmpeg\headers\libavutil_eval.pas',
libavutil_error in '..\..\ffmpeg\headers\libavutil_error.pas',
libavutil_display in '..\..\ffmpeg\headers\libavutil_display.pas',
libavutil_dict in '..\..\ffmpeg\headers\libavutil_dict.pas',
libavutil_cpu in '..\..\ffmpeg\headers\libavutil_cpu.pas',
libavutil_common in '..\..\ffmpeg\headers\libavutil_common.pas',
libavutil_channel_layout in '..\..\ffmpeg\headers\libavutil_channel_layout.pas',
libavutil_buffer in '..\..\ffmpeg\headers\libavutil_buffer.pas',
libavutil_bprint in '..\..\ffmpeg\headers\libavutil_bprint.pas',
libavutil_avstring in '..\..\ffmpeg\headers\libavutil_avstring.pas',
libavutil_audio_fifo in '..\..\ffmpeg\headers\libavutil_audio_fifo.pas',
libavutil in '..\..\ffmpeg\headers\libavutil.pas',
libavformat_url in '..\..\ffmpeg\headers\libavformat_url.pas',
libavformat_avio in '..\..\ffmpeg\headers\libavformat_avio.pas',
libavformat in '..\..\ffmpeg\headers\libavformat.pas',
libavfilter_formats in '..\..\ffmpeg\headers\libavfilter_formats.pas',
libavfilter_buffersrc in '..\..\ffmpeg\headers\libavfilter_buffersrc.pas',
libavfilter_buffersink in '..\..\ffmpeg\headers\libavfilter_buffersink.pas',
libavfilter_avcodec in '..\..\ffmpeg\headers\libavfilter_avcodec.pas',
libavfilter in '..\..\ffmpeg\headers\libavfilter.pas',
libavdevice in '..\..\ffmpeg\headers\libavdevice.pas',
libavcodec_avfft in '..\..\ffmpeg\headers\libavcodec_avfft.pas',
libavcodec in '..\..\ffmpeg\headers\libavcodec.pas',
libswresample in '..\..\ffmpeg\headers\libswresample.pas';

end.
Цитировать
Alex
0 #5 Alex 06.10.2017 13:24
Цитирую albionseo:
да уже разобрался, с 50 попытки получилось, там еще c dll что то не то было, вобщем, кто найдет данный пост, посмотрите сперва VisualLab там есть компоненты под делфи на том же openvc
Ссылку, пожалуйста, дайте.
Цитировать

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


Защитный код
Обновить