Этот пример показывает, как использовать MATLAB® Coder™, чтобы сгенерировать код С от файла MATLAB и развернуть приложение на цели ARM.
Пример читает кадры видео из веб-камеры и обнаруживает поверхности в каждом из кадров с помощью алгоритма обнаружения поверхности Виолы - Джонса. Обнаруженные поверхности отображены с ограничительными рамками. Функция веб-камеры, от 'Пакета Поддержки MATLAB для Веб-камер USB' и объекта VideoPlayer, от Системы Компьютерного зрения toolbox™, используется для симуляции на хосте MATLAB. Две функции не поддерживают цель ARM, таким образом, находящийся в OpenCV читатель веб-камеры и видео функции средства просмотра используются для развертывания.
Цель должна иметь библиотеки версии 3.4.0 OpenCV (созданный с GTK) и стандартный компилятор C++. Raspberry Pi 2 с операционной системой Фрагмента Raspbian использовался для развертывания. Пример должен работать над любой целью ARM.
Этот пример требует лицензии MATLAB Coder.
Этим примером является функция с основной частью наверху и стандартными программами помощника в форме вложенных функций ниже.
function FaceDetectionARMCodeGenerationExample()
Чтобы запустить этот пример, у вас должен быть доступ к компилятору C++, и необходимо сконфигурировать его с помощью 'mex - устанавливают C++' команда. Для получения дополнительной информации смотрите, Выбирают C ++ Compiler.
MATLAB Coder требует, чтобы код MATLAB был в форме функции в порядке сгенерировать код С. Код для основного алгоритма этого примера находится в функции, вызванной faceDetectionARMKernel.m. Функция берет изображение из веб-камеры как вход. Функциональные выходные параметры изображение с ограничительной рамкой вокруг обнаруженных поверхностей. Выходное изображение будет отображено на видео окне средства просмотра. Чтобы изучить, как изменить код MATLAB, чтобы сделать его совместимым для генерации кода, можно посмотреть на Введение в качестве примера в Генерацию кода с Соответствием Функции и Регистрацией
fileName = 'faceDetectionARMKernel.m';
Для цели независимого исполняемого файла MATLAB Coder требует, чтобы вы создали файл C, содержащий "основную" функцию с именем. Этот пример использует faceDetectionARMMain.c файл. Эта основная функция в этом файле выполняет следующие задачи:
Кадры видео чтений от веб-камеры
Передает кадры видео к алгоритму обнаружения поверхности
Отображения выводят кадры, содержащие ограничительные рамки вокруг обнаруженных поверхностей
Для симуляции на хосте MATLAB задачи, выполняемые в faceDetectionARMMain.c файле, реализованы в faceDetectionARMMain.m
Для развертывания на ARM этот пример реализует использование функциональности читателя веб-камеры функции OpenCV. Это также реализует видео использование средства просмотра функции OpenCV. Эти основанные на OpenCV служебные функции реализованы в следующих файлах:
helperOpenCVWebcam.hpp
helperOpenCVWebcam.cpp
helperOpenCVVideoViewer.cpp
helperOpenCVVideoViewer.hpp
Для симуляции на хосте MATLAB пример использует функцию веб-камеры от 'Пакета Поддержки MATLAB для Веб-камер USB' и объекта VideoPlayer от Системного тулбокса Компьютерного зрения. Запустите симуляцию на хосте MATLAB путем ввода faceDetectionARMMain в командной строке MATLAB®.
Этот пример требует, чтобы вы установили библиотеки OpenCV 3.4.0 по своей цели ARM. Видео средство просмотра требует, чтобы вы создали highqui библиотеку в OpenCV с GTK для цели ARM.
Выполните шаги, чтобы загрузить и создать OpenCV 3.4.0 на Raspberry Pi 2 с предварительно установленным Фрагментом Raspbian. Необходимо обновить системное встроенное программное обеспечение или установить другие инструменты разработчика и пакеты по мере необходимости для конфигурации системы, прежде чем вы начнете создавать OpenCV.
Выключите INSTALL_C_EXAMPLES из-за: https://github.com/opencv/opencv/issues/5851
Выключите ENABLE_PRECOMPILED_HEADERS из-за: https://github.com/opencv/opencv/issues/9942
$ wget-O opencv-3.4.0.zip https://github.com/opencv/opencv/archive/3.4.0.zip
$ разархивировали opencv-3.4.0.zip
CD $ opencv-3.4.0
$ mkdir сборка
Сборка CD $
$ cmake-D CMAKE_BUILD_TYPE=RELEASE-D CMAKE_INSTALL_PREFIX =/usr/local-D ИНСТАЛЛ_К_ЕКСЭМПЛЕС=ОФФ-D BUILD_EXAMPLES=ON-D WITH_GTK=ON-D ВИТ_ФФМПЕГ=ОФФ-D ЭНЭБЛЕ_ПРЕКОМПИЛЕД_ХЭДЕРС=ОФФ..
Эти шаги выполнены, чтобы скомпилировать и установить OpenCV:
$ делают
$ sudo делают установку
Для официального развертывания примера библиотеки OpenCV были установлены в следующей директории на Raspberry Pi 2:
/usr/local/lib
и связанные заголовки были помещены в
/usr/local/include
Создайте объект настройки генерации кода для EXE вывод.
codegenArgs = createCodegenArgs();
Вызовите codegen команду.
fprintf('-> Generating Code (it may take a few minutes) ....\n'); codegen(codegenArgs{:}, fileName); % During code generation, all dependent file information is stored in a mat % file named buildInfo.mat.
-> Generating Code (it may take a few minutes) ....
Используйте информацию сборки, хранившую в buildInfo.mat, чтобы создать папку zip с помощью packNGo.
fprintf('-> Creating zip folder (it may take a few minutes) ....\n'); bInfo = load(fullfile('codegen','exe','faceDetectionARMKernel','buildInfo.mat')); packNGo(bInfo.buildInfo, {'packType', 'hierarchical', ... 'fileName', 'faceDetectionARMKernel'}); % The generated zip folder is faceDetectionARMKernel.zip
-> Creating zip folder (it may take a few minutes) ....
Разархивируйте faceDetectionARMKernel.zip в папку под названием FaceDetectionARM. Разархивируйте все файлы и удалите .zip файлы.
packngoDir = hUnzipPackageContents();
Make-файл, faceDetectionARMMakefile.mk, предоставленный в этом примере, записаны для Raspberry Pi 2 с определенными флагами оптимизации. Make-файл был записан, чтобы работать с GCC в среде Linux и с вашими библиотеками OpenCV, расположенными в/usr/local/lib. Можно обновить Make-файл на основе целевой настройки. Скопируйте Make-файл в папку проекта.
copyfile('faceDetectionARMMakefile.mk', packngoDir); % Also move the file containing the main function in the top level folder. copyfile('faceDetectionARMMain.c', packngoDir); % For simplicity, make sure the root directory name is matlab. setRootDirectory(packngoDir);
Разверните свой проект на ARM:
disp('Follow these steps to deploy your project on ARM');
Follow these steps to deploy your project on ARM
Передайте свою папку проекта под названием FaceDetectionARM к вашей цели ARM использование вашего предпочтительного инструмента передачи файлов. Поскольку Raspberry Pi 2 (с Фрагментом Raspbian) уже имеет сервер SSH, можно использовать SFTP, чтобы передать файлы от хоста до цели.
Для официального развертывания этого примера клиент FileZilla SFTP был установлен на хост-машине, и папка проекта была передана от хоста до/home/pi/FaceDetectionARM папки на Raspberry Pi.
disp('Step-1: Transfer the folder ''FaceDetectionARM'' to your ARM target');
Step-1: Transfer the folder 'FaceDetectionARM' to your ARM target
Запустите make-файл, чтобы создать исполняемый файл на ARM. Для Raspberry Pi 2, (с Фрагментом Raspbian), открывают интерпретатор Linux и CD к/home/pi/FaceDetectionARM. Создайте исполняемый файл с помощью следующей команды:
сделайте-f faceDetectionARMMakefile
Команда создает исполняемый файл, faceDetectionARMKernel.
disp('Step-2: Build the executable on ARM using the shell command: make -f faceDetectionARMMakefile.mk');
Step-2: Build the executable on ARM using the shell command: make -f faceDetectionARMMakefile.mk
Запустите исполняемый файл, сгенерированный в перечисленном выше шаге. Для Raspberry Pi 2, (с Фрагментом Raspbian), используют следующую команду в окне интерпретатора:
./faceDetectionARMKernel
Убедитесь, что вы соединяетесь с Raspberry Pi с менеджером окон, и не только через терминал командной строки, чтобы избежать ошибок, связанных с GTK. Это необходимо для окна отслеживания, чтобы обнаружиться.
Чтобы закрыть видео средство просмотра, в то время как исполняемый файл работает на Raspberry Pi2, нажмите на видео средство просмотра и нажмите клавишу выхода.
disp('Step-3: Run the executable on ARM using the shell command: ./faceDetectionARMKernel');
Step-3: Run the executable on ARM using the shell command: ./faceDetectionARMKernel
% Configure coder to create executable. Use packNGo at post code % generation stage. function codegenArgs = createCodegenArgs() % Create arguments required for code generation. % First - create configuration object % % For standalone executable a main C function is required. The % faceDetectionARMMain.c created for this example is compatible % with the content of the file faceDetectionARMKernel.m mainCFile = 'faceDetectionARMMain.c'; % Include helper functions camCPPFile = 'helperOpenCVWebcam.cpp'; viewerCPPFile = 'helperOpenCVVideoViewer.cpp'; % Handle path with space if contains(mainCFile, ' ') mainCFile = ['"' mainCFile '"']; camCPPFile = ['"' camCPPFile '"']; viewerCPPFile = ['"' viewerCPPFile '"']; end % Create configuration object cfg = coder.config('exe'); cfg.CustomSource = sprintf('%s\n%s\n%s',mainCFile,camCPPFile,viewerCPPFile); cfg.CustomInclude = pwd; % Set production hardware to ARM to generate ARM compatible portable code cfg.HardwareImplementation.ProdHWDeviceType = 'ARM Compatible->ARM Cortex'; cfg.EnableOpenMP = false; % Create input arguments inRGB_type = coder.typeof(uint8(0),[480 640 3]); % Use '-c' option to generate C code without calling C++ compiler. codegenArgs = {'-config', cfg, '-c', '-args', {inRGB_type}}; end % Unzip the packaged zip file function packngoDir = hUnzipPackageContents() packngoDirName = 'FaceDetectionARM'; % create packngo directory mkdir(packngoDirName); % get the name of the single zip file generated by packngo zipFile = dir('*.zip'); assert(numel(zipFile)==1); unzip(zipFile.name,packngoDirName); % unzip internal zip files created in hierarchical packNGo zipFileInternal = dir(fullfile(packngoDirName,'*.zip')); for i=1:numel(zipFileInternal) unzip(fullfile(packngoDirName,zipFileInternal(i).name), ... packngoDirName); end % delete internal zip files delete(fullfile(packngoDirName,'*.zip')); packngoDir = packngoDirName; end % Set root directory as matlab function setRootDirectory(packngoDir) dirList = dir(packngoDir); if isempty(find(ismember({dirList.name},'matlab'), 1)) % root directory is not matlab. Change it to matlab for i=1:length(dirList) thisDir = fullfile(packngoDir,dirList(i).name, 'toolbox', 'vision'); if isfolder(thisDir) % rename the dir movefile(fullfile(packngoDir,dirList(i).name), ... fullfile(packngoDir,'matlab')); break; end end end end
end