В этом примере показано, как использовать Coder™ MATLAB ® для генерации кода С из файла MATLAB и развертывания приложения на целевом компьютере ARM.
В примере считываются видеокадры с веб-камеры. Он обнаруживает лицо с помощью алгоритма обнаружения лица виолы-Джонса и отслеживает лицо в живом видеопотоке с помощью алгоритма KLT. Он наконец отображает систему координат с ограничивающим прямоугольником и набором маркеров вокруг отслеживаемой грани. Функция веб-камеры от 'MATLAB Support Package for USB Webcams' и объект VideoPlayer от toolbox™ Компьютерное Зрение System используются для симуляции на хосте MATLAB. Две функции не поддерживают ARM-цель, поэтому для развертывания используются функции webcam reader и средство просмотра на основе OpenCV.
Целевой объект должен иметь библиотеки OpenCV версии 3.4.0 (созданные с использованием GTK) и стандартный компилятор C++. Для развертывания использовался Raspberry Pi 2 с операционной системой Raspbian Stretch. Пример должен работать с любой ARM-мишенью.
Для этого примера требуется лицензия MATLAB Coder.
Этот пример является функцией с основным телом в верхней части и стандартными программами в форме Вложенных функций ниже.
function FaceTrackingARMCodeGenerationExample()
Чтобы запустить этот пример, вы должны иметь доступ к компилятору C++, и вы должны сконфигурировать его с помощью команды 'mex -setup c++'. Для получения дополнительной информации смотрите Выбор компилятора C++.
MATLAB Coder требует, чтобы код MATLAB был в форме функции, порядка для генерации Кода С. Код для основного алгоритма этого примера находится в функции под названием faceTrackingARMKernel.m. Функция берет изображение с веб-камеры, как вход. Функция выводит изображение с ограничивающим прямоугольником и набором маркеров вокруг грани. Выходное изображение будет отображаться в окне средства просмотра видео. Чтобы узнать, как изменить код MATLAB, чтобы сделать его совместимым для генерации кода, можно посмотреть пример Введение в генерацию кода с сопоставлением функций и регистрацией.
fileName = 'faceTrackingARMKernel.m';
Для независимого исполняемого файла цели MATLAB Coder требует, чтобы вы создали файл на C, содержащий функцию с именем «main». Этот пример использует файл faceTrackingARMMain.c. Эта основная функция в этом файле выполняет следующие задачи:
Считывает видеокадры с веб-камеры
Отправляет видеокадры в алгоритм отслеживания лиц
Отображает выходные системы координат, содержащие ограничивающий прямоугольник и маркеры вокруг грани
Для симуляции на хосте MATLAB задачи, выполняемые в файле face Tracking ARMM ain.c, реализованы в face Tracking ARMM ain.m
Для развертывания на ARM в этом примере реализована функциональность webcam reader с помощью функций OpenCV. Также реализуется средство просмотра видео с использованием функций OpenCV. Эти служебные функции на основе OpenCV реализованы в следующих файлах:
helperOpenCVWebcam.hpp
helperOpenCVWebcam.cpp
helperOpenCVVideoViewer.cpp
helperOpenCVVideoViewer.hpp
Для симуляции на хосте MATLAB в примере используется функция веб-камеры из 'MATLAB Support Package for USB Webcams' и объект VideoPlayer из тулбокса Компьютерное Зрение System. Запустите симуляцию на хосте MATLAB, набрав faceTrackingARMMain в командной строке MATLAB ®.
Этот пример требует установки библиотек OpenCV 3.4.0 на целевом компьютере ARM. Средство просмотра видео требует, чтобы вы создали библиотеку highgui в OpenCV с GTK для ARM-цели.
Следуйте инструкциям, чтобы загрузить и создать OpenCV 3.4.0 на Raspberry Pi 2 с предустановленным Raspbian Stretch. Перед началом создания 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
$ unzip 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 выполните следующие шаги:
$ make
$ 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) .... Code generation successful.
Используйте сведения о сборке, хранящиеся в buildInfo.mat, чтобы создать zip-папку с помощью packNGo.
fprintf('-> Creating zip folder (it may take a few minutes) ....\n'); bInfo = load(fullfile('codegen','exe','faceTrackingARMKernel','buildInfo.mat')); packNGo(bInfo.buildInfo, {'packType', 'hierarchical', ... 'fileName', 'faceTrackingARMKernel'}); % The generated zip folder is faceTrackingARMKernel.zip
-> Creating zip folder (it may take a few minutes) ....
Unzip faceTrackingARMKernel.zip в папку с именем FaceTrackingARM. Разархивируйте все файлы и удаляйте zip-файлы.
packngoDir = hUnzipPackageContents();
Warning: Directory already exists.
Make, faceTrackingARMMakefile.mk, представленный в этом примере, написан для Raspberry PI 2 со специфическими флагами оптимизации. Make был написан для работы с GCC в среде Linux и с вашими библиотеками OpenCV, расположенными в/usr/local/lib. Вы можете обновить Make-файл на основе вашего целевого строения. Скопируйте Make-файл в папку проекта.
copyfile('faceTrackingARMMakefile.mk', packngoDir); % Also move the file containing the main function in the top level folder. copyfile('faceTrackingARMMain.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
Перенесите папку проекта с именем FaceTrackingARM в целевое устройство ARM с помощью предпочитаемого инструмента передачи файлов. Поскольку Raspberry Pi 2 (с Raspbian Stretch) уже имеет SSH-сервер, можно использовать SFTP для передачи файлов с хоста на целевой.
Для официального развертывания этого примера на хост-машине был установлен клиент FileZilla SFTP и папка проекта была перенесена с хоста в папку/home/pi/FaceTrackingARM на Raspberry Pi.
disp('Step-1: Transfer the folder ''FaceTrackingARM'' to your ARM target');
Step-1: Transfer the folder 'FaceTrackingARM' to your ARM target
Запустите make-файл, чтобы создать исполняемый файл на ARM. Для Raspberry Pi 2 (с Raspbian Stretch) откройте терминал командной строки и 'cd' to/home/pi/FaceTrackingARM. Создайте исполняемый файл с помощью следующей команды:
сделать -f faceTrackingARMMakefile.mk
Команда создает исполняемый файл, faceTrackingARMKernel.
disp('Step-2: Build the executable on ARM using the shell command: make -f faceTrackingARMMakefile.mk');
Step-2: Build the executable on ARM using the shell command: make -f faceTrackingARMMakefile.mk
Запустите исполняемый файл, сгенерированный на вышеописанном шаге. Для Raspberry Pi 2 (с Raspbian Stretch) используйте следующую команду в окне интерпретатора:
./faceTrackingARMKernel
Убедитесь, что вы подключены к Raspberry Pi с помощью оконного менеджера, а не только через терминал командной строки, чтобы избежать ошибок, связанных с GTK. Это необходимо для отображения окна отслеживания.
Чтобы закрыть средство просмотра видео во время работы исполняемого файла на Pi2 Raspberry, нажмите на средство просмотра видео и нажмите клавишу escape.
disp('Step-3: Run the executable on ARM using the shell command: ./faceTrackingARMKernel');
Step-3: Run the executable on ARM using the shell command: ./faceTrackingARMKernel
% 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 % faceTrackingARMMain.c created for this example is compatible % with the content of the file faceTrackingARMKernel.m mainCFile = 'faceTrackingARMMain.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 = 'FaceTrackingARM'; % 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 = fullfile(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