Рейтинг@Mail.ru

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

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

Рейтинг:  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
+1 #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
+1 #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
Ссылку, пожалуйста, дайте.
Цитировать

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