主要内容

轨道面(覆盆子PI2)

此示例显示如何使用MATLAB®Coder™从MATLAB文件生成C代码并在ARM目标上部署应用程序。

该示例从网络摄像头读取视频帧。它使用Viola-Jones脸部检测算法检测面部,并使用KLT算法跟踪实时视频流中的面部。它终于用边界框显示框架,并围绕被跟踪的面部的一组标记。从计算机Vision System Toolbox™的“USB网络摄金宝app像头”和VideoPlayer对象的“MATLAB支持包”以及VideoPlayer对象中的网络摄像头函数用于Matlab主机上的模拟。这两个函数不支持ARM目标,因此OpenCV的网络金宝app摄像头读取器和视频查看器功能用于部署。

目标必须具有OpenCV版本3.4.0库(使用GTK构建)和标准的C ++编译器。使用Raspbian Stretch操作系统的覆盆子PI 2用于部署。该示例应在任何ARM目标上工作。

此示例需要MATLAB编码器许可证。

此示例是顶部和辅助程序的主体的函数嵌套功能以下。

函数FaceTrackingARMCodeGenerationExample ()

设置您的C ++编译器

要运行此示例,您必须访问C ++编译器,您必须使用'mex -setup c ++'命令配置它。有关更多信息,请参阅选择C ++编译器

将算法的计算部分分解为单独的MATLAB函数

MATLAB编码器需要MATLAB代码以函数的形式才能生成C代码。此示例的主要算法的代码驻留在一个调用的函数中faceTrackingARMKernel.m。该函数从网络摄像头拍摄图像,作为输入。该功能用边界框输出图像和脸部周围的一组标记。输出图像将显示在视频查看器窗口上。要了解如何修改MATLAB代码以使其兼容代码生成,可以查看示例具有功能匹配和注册的代码生成简介

filename ='faceTrackingarmkernel.m'

使用I / O功能创建主要功能

对于一个独立的可执行目标,MATLAB Coder要求你创建一个包含名为“main”函数的C文件。这个例子使用了faceTrackingARMMain.c文件。这个文件中的main函数执行以下任务:

  • 从网络摄像头读取视频帧

  • 向面部跟踪算法发送视频帧

  • 显示包含边界框和面部上标记的输出框架

为了在MATLAB主机上进行仿真,在faceTrackingARMMain.m中实现faceTrackingARMMain.c文件中执行的任务

网络摄像头阅读器和视频查看器

对于ARM上的部署,此示例使用OpenCV函数实现网络摄像头阅读器功能。它还使用OpenCV函数实现视频查看器。这些基于OpenCV的实用程序函数在以下文件中实现:

  • helperopencvwebacam.hpp.

  • helperOpenCVWebcam.cpp

  • helperopencvvideoviewer.cpp.

  • helperOpenCVVideoViewer.hpp

对于MATLAB主机的仿真,该示例使用来自“MATLAB支持包”的“MATLAB支持包”和“MATLAB支持包”和“计算机视觉系统”工具箱中的“MATLAB支持包”和Vi金宝appdeoPlayer对象。通过在MATLAB®命令行中键入FaceTrakingArmain在MATLAB主机上运行模拟。

OpenCV for Arm目标

此示例要求您在ARM目标上安装OpenCV 3.4.0库。视频查看器要求您在OpenCV中构建HighGui库,GTK为ARM目标。

使用预安装的raspbian伸展,请按照下载和构建OpenCV 3.4.0的步骤。您必须在开始构建OpenCV之前根据系统配置更新系统固件或安装其他开发人员工具和软件包。

关闭install_c_examples:https://github.com/opencv/opencvh/issues/5851

关闭enable_precompiled_headers由于:https://github.com/opencv/opencencv/issues/9942

  • $ wget -o opencv-3.4.0.ziphttps://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 INSTALL_C_EXAMPLES=OFF -D BUILD_EXAMPLES=ON -D WITH_GTK=ON -D WITH_FFMPEG=OFF -D ENABLE_PRECOMPILED_HEADERS=OFF ..

编译和安装OpenCV的步骤如下:

  • $ make

  • $ sudo make安装

对于官方部署示例,OpenCV库安装在Raspberry PI 2上的以下目录中:

/ usr / local / lib

并将相关的头部放入

/ usr / local /包括

配置代码生成参数

创建用于EXE输出的代码生成配置对象。

codegenargs = createCodegenargs();

生成代码

调用codegen命令。

FPRINTF(' - >生成代码(可能需要几分钟).... \ n');Codegen(Codegenargs {:},文件名);%在代码生成过程中,所有依赖文件信息都存储在一个mat中文件名为buildInfo.mat。
- >生成代码(可能需要几分钟)....代码生成成功。

创建打包的zip文件

使用存储在buildInfo中的构建信息。使用packNGo创建一个zip文件夹。

FPRINTF(' - >创建zip文件夹(可能需要几分钟).... \ n');binfo = load(fullfile(“codegen”'可执行程序''faceTrackingArmkern''buildinfo.mat'));packNGo (bInfo。buildInfo, {'packtype'“分层”......'文档名称''faceTrackingArmkern'});生成的zip文件夹是faceTrackingArmKernel.zip
- >创建zip文件夹(可能需要几分钟)....

创建项目文件夹

解压缩arpetrackingarnel.zip到名为faceTrackingarm的文件夹中。解压缩所有文件并删除.zip文件。

packngodir = hunzippackageContents();
警告:目录已存在。

更新makefile并复制到项目文件夹

在此示例中提供的Makefile,FaceTrackingArmMakeFile.mk是针对具有特定优化标志的raspberry pi 2编写的。Makefile在Linux环境中使用GCC编写,以及您的OpenCV库位于/ usr / local / lib中。您可以根据目标配置更新Makefile。将makefile复制到项目文件夹。

拷贝文件('faceTrackingarmakefile.mk',packngodir);%还将包含顶级文件夹中的主函数的文件移动。拷贝文件('faceTrackingarmmain.c',packngodir);%为简单起见,确保根目录名称是MATLAB。setRootDirectory (packngoDir);

手臂部署

在ARM上部署你的项目:

disp (“遵循以下步骤在ARM上部署项目”);
按照以下步骤在ARM上部署项目

将代码转移到ARM目标

使用您首选的文件传输工具将名为FaceTrackingARM的项目文件夹转移到您的ARM目标。由于Raspberry Pi 2(带Raspbian Stretch)已经有了一个SSH服务器,你可以使用SFTP从主机传输文件到目标。

对于此示例的官方部署,FileZilla SFTP客户端安装在主机上,项目文件夹从主机传输到/ home / pi / faceTrackarm树莓派的文件夹。

disp ('step-1:将文件夹'''faceTrackingarm''转移到您的ARM目标');
步骤1:将文件夹“FaceTrakingArm”传输到您的ARM目标

构建手臂上的可执行文件

运行makefile在ARM上构建可执行文件。对于Raspberry Pi 2,(使用Raspbian Stretch),打开命令行终端并'cd'到/home/pi/FaceTrackingARM。使用以下命令构建可执行文件:

make -f faceTrackingarmmakefile.mk.

该命令创建一个可执行文件FaceTrackingArmkernel。

disp (“第二步:使用shell命令在ARM上构建可执行文件:make -f faceTrackingARMMakefile.mk”);
步骤2:使用shell命令在ARM上构建可执行文件:make -f faceTrackingARMMakefile.mk

在ARM上运行可执行文件

运行上述步骤中生成的可执行文件。对于Raspberry PI 2,(使用Raspbian Stretch),请使用shell窗口中的以下命令:

。/ faceTrackingARMKernel

确保使用Window Manager连接到Raspberry PI,而不仅仅是通过命令行终端,以避免与GTK相关的错误。这是跟踪窗口所显示的。

要在raspberry pi2上运行可执行文件时关闭视频查看器,请单击视频查看器,然后按转义键。

disp ('step-3:使用shell命令运行可执行文件:./facetrackingarmkernel');
步骤3:使用shell命令运行可执行文件:./facetrackingarmkernel

附录-辅助功能

%配置编码器以创建可执行文件。在邮政编码中使用packngo%代阶段。函数codegenargs = createCodeGenargs()%创建代码生成所需的参数。%首先创建配置对象独立可执行文件的%需要主C函数。这为此示例创建的%faceTrackingArmain.cc兼容百分比faceTrackingarmkernel.m的文件内容maincfile ='faceTrackingarmmain.c'%包含助手函数camcppfile =“helperOpenCVWebcam.cpp”;查看ercppfile=.'helperopencvvideoviewer.cpp'%处理空间的路径如果包含(maincfile,'') mainCFile = ['“'maincfile.'“'];camcppfile = ['“'camcppfile.'“'];查看ercppfile= ['“'查看ercppfile.'“'];结尾%创建配置对象cfg = coder.config('可执行程序');cfg.customsource = sprintf('%s \ n%s \ n%s', camCPPFile mainCFile viewerCPPFile);cfg。CustomInclude = pwd;%将生产硬件设置为ARM生成ARM兼容的便携式代码cfg.hardwareimplingation.prodhwdeviceType =“胳膊兼容- >部门皮层”;cfg。EnableOpenMP = false;%创建输入参数inrgb_type = coder.typeof(uint8(0),[480 640 3]);%使用'-c'选项生成C代码而无需调用C ++编译器。codegenargs = {'-config',cfg,“c”'-args',{inrgb_type}};结尾%解压缩包装的zip文件函数packngoDir = hunzippackageconcontent () packngoDirName ='faceTrackingarm'%create packngo目录mkdir (packngoDirName);%获取由packngo生成的单个zip文件的名称zipFile = dir ('*。压缩');断言(Numel(ZipFile)== 1);解压缩(zipfile.name,packngodirname);%unzip内部zip文件在分层packngo中创建zipfileinternal = dir(fullfile(packngodirname,'*。压缩'));为了i = 1:numel(zipfileinternal)解压缩(fullfile(packngodirname,zipfileinternal(i).name),......packngodirname);结尾%删除内部zip文件删除(fullfile(packngodirname,'*。压缩'));packngodir = fullfile(packngodirname);结尾%设置根目录为matlab函数SetrootDirectory(Packngodir)Dirlist = Dir(Packngodir);如果isempty (find (ismember ({dirList.name},'matlab'),1))%根目录不是MATLAB。将它更改为matlab为了i = 1:长度(dirlist)thatdir = fullfile(packngodir,dirlist(i).name,“工具箱”'想象');如果Isfolder(Thisdir)%重命名dirmovefile(fullfile(packngodir,dirlist(i).name),......fullfile (packngoDir'matlab'));打破结尾结尾结尾结尾
结尾