Обнаружьте поверхность (Raspberry Pi2)

В этом примере показано, как использовать 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++

Чтобы запустить этот пример, у вас должен быть доступ к компилятору C++, и необходимо сконфигурировать его с помощью 'mex - устанавливают C++' команда. Для получения дополнительной информации смотрите, Выбирают C ++ Compiler.

Вспыхните вычислительная часть алгоритма в отдельную функцию MATLAB

MATLAB Coder требует, чтобы код MATLAB был в форме функции для того, чтобы сгенерировать код С. Код для основного алгоритма этого примера находится в функции, вызванной faceDetectionARMKernel.m. Функция берет изображение из веб-камеры как вход. Функциональные выходные параметры изображение с ограничительной рамкой вокруг обнаруженных поверхностей. Выходное изображение будет отображено на видео окне средства просмотра. Чтобы изучить, как изменить код MATLAB, чтобы сделать его совместимым для генерации кода, можно посмотреть на Введение в качестве примера в Генерацию кода с Соответствием Функции и Регистрацией.

fileName = 'faceDetectionARMKernel.m';

Создайте Основную Функцию с Функциональностью ввода-вывода

Для цели независимого исполняемого файла MATLAB Coder требует, чтобы вы создали файл C, содержащий "основную" функцию с именем. Этот пример использует faceDetectionARMMain.c файл. Эта основная функция в этом файле выполняет следующие задачи:

  • Видеокадры чтений от веб-камеры

  • Отправляет видеокадры в алгоритм обнаружения поверхности

  • Отображения выводят системы координат, содержащие ограничительные рамки вокруг обнаруженных поверхностей

Для симуляции на хосте MATLAB задачи, выполняемые в faceDetectionARMMain.c файле, реализованы в faceDetectionARMMain.m

Читатель веб-камеры и Video Viewer

Для развертывания на ARM этот пример реализует использование функциональности читателя веб-камеры функции OpenCV. Это также реализует видео использование средства просмотра функции OpenCV. Эти основанные на OpenCV служебные функции реализованы в следующих файлах:

  • helperOpenCVWebcam.hpp

  • helperOpenCVWebcam.cpp

  • helperOpenCVVideoViewer.cpp

  • helperOpenCVVideoViewer.hpp

Для симуляции на хосте MATLAB пример использует функцию веб-камеры от 'Пакета поддержки MATLAB для Веб-камер USB' и объекта VideoPlayer от Системного тулбокса Компьютерного зрения. Запустите симуляцию на хосте MATLAB путем ввода faceDetectionARMMain в командной строке MATLAB®.

OpenCV для цели ARM

Этот пример требует, чтобы вы установили библиотеки 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) ....
Code generation successful.

Создайте упакованный zip-файл

Используйте информацию сборки, хранившую в 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();
Warning: Directory already exists. 

Обновите make-файл и копию, чтобы спроектировать папку

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

Разверните свой проект на ARM:

disp('Follow these steps to deploy your project on ARM');
Follow these steps to deploy your project on ARM

Передайте код цели 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

Создайте исполняемый файл на ARM

Запустите 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

Запустите исполняемый файл на ARM

Запустите исполняемый файл, сгенерированный в перечисленном выше шаге. Для 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