Отследите поверхность (Raspberry Pi2)

В этом примере показано, как использовать MATLAB® Coder™, чтобы сгенерировать код С от файла MATLAB и развернуть приложение на цели ARM.

Пример читает видеокадры из веб-камеры. Это обнаруживает поверхность с помощью алгоритма обнаружения поверхности Виолы - Джонса и отслеживает поверхность в живом видеопотоке с помощью алгоритма KLT. Это наконец отображает систему координат с ограничительной рамкой и набором маркеров вокруг прослеживаемой поверхности. Функция веб-камеры, от 'Пакета Поддержки MATLAB для Веб-камер USB' и объекта VideoPlayer, от Системы Компьютерного зрения toolbox™, используется для симуляции на хосте MATLAB. Две функции не поддерживают цель ARM, таким образом, находящийся в OpenCV читатель веб-камеры и видео функции средства просмотра используются для развертывания.

Цель должна иметь библиотеки версии 3.4.0 OpenCV (созданный с GTK) и стандартный компилятор C++. Raspberry Pi 2 с операционной системой Фрагмента Raspbian использовался для развертывания. Пример должен работать над любой целью ARM.

Этот пример требует лицензии MATLAB Coder.

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

function FaceTrackingARMCodeGenerationExample()

Настройте свой компилятор C++

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

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

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

fileName = 'faceTrackingARMKernel.m';

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

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

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

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

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

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

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

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

  • helperOpenCVWebcam.hpp

  • helperOpenCVWebcam.cpp

  • helperOpenCVVideoViewer.cpp

  • helperOpenCVVideoViewer.hpp

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

OpenCV для цели ARM

Этот пример требует, чтобы вы установили библиотеки OpenCV 3.4.0 по своей цели ARM. Видео средство просмотра требует, чтобы вы создали highgui библиотеку в 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','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) ....

Создайте папку проекта

Разархивируйте faceTrackingARMKernel.zip в папку под названием FaceTrackingARM. Разархивируйте все файлы и удалите .zip файлы.

packngoDir = hUnzipPackageContents();
Warning: Directory already exists. 

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

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

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

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

Передайте код цели ARM

Передайте свою папку проекта под названием FaceTrackingARM к вашей цели ARM использование вашего предпочтительного инструмента передачи файлов. Поскольку Raspberry Pi 2 (с Фрагментом Raspbian) уже имеет сервер 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

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

Запустите make-файл, чтобы создать исполняемый файл на ARM. Для Raspberry Pi 2, (с Фрагментом Raspbian), открывают терминал командной строки и 'CD' к/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

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

Запустите исполняемый файл, сгенерированный в перечисленном выше шаге. Для Raspberry Pi 2, (с Фрагментом Raspbian), используют следующую команду в окне интерпретатора:

./faceTrackingARMKernel

Убедитесь, что вы соединяетесь с Raspberry Pi с менеджером окон, и не только через терминал командной строки, чтобы избежать ошибок, связанных с GTK. Это необходимо для окна отслеживания, чтобы обнаружиться.

Чтобы закрыть видео средство просмотра, в то время как исполняемый файл работает на Raspberry Pi2, нажмите на видео средство просмотра и нажмите клавишу выхода.

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