主要内容

Track Face(覆盆子Pi2)

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

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

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

这个例子需要MATLAB编码器许可证。

这个例子是一个函数,主体位于顶部,助手例程的形式为嵌套功能以下。

功能FaceTrackingArmodegenerationExample()

设置C ++编译器

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

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

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

filename =.“faceTrackingARMKernel.m”

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

对于独立的可执行目标,Matlab编码器要求您创建包含名为“main”函数的C文件。此示例使用FaceTrackingArmMain.c文件。此文件中的此主要函数执行以下任务:

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

  • 将视频帧发送给人脸跟踪算法

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

对于MATLAB主机的仿真,在FaceTrackingArmMain.c文件中执行的任务是在FaceTrackingArmmain.M中实施的

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

为了在ARM上部署,这个例子使用OpenCV函数实现了摄像头读取器功能。它还使用OpenCV函数实现了一个视频查看器。这些基于OpenCV的实用函数在以下文件中实现:

  • helperopencvwebacam.hpp.

  • helperopencvwebcam.cpp.

  • helperOpenCVVideoViewer.cpp

  • helperopencvvideoviewer.hpp.

为了在MATLAB主机上进行仿真,示例使用了“MATLAB USB网络摄像头支持包”中的网络摄像头功能和计算机视觉系统工具箱中的VideoPlayer对象。金宝app通过在MATLAB®命令行输入faceTrackingARMMain在MATLAB主机上运行仿真。

针对ARM目标的OpenCV

这个例子要求你在ARM目标上安装OpenCV 3.4.0库。视频查看器要求您使用GTK在OpenCV中构建用于ARM目标的highgui库。

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

关闭INSTALL_C_EXAMPLES,原因如下:https://github.com/opencv/opencvv/issues/5851

关闭ENABLE_PRECOMPILED_HEADERS因为:https://github.com/opencv/opencvv/issues/9942

  • $ wget -o opencv-3.4.0.ziphttps://github.com/opencv/opencvv/archive/3.4.0.zip.

  • $ unzip opencv-3.4.0.zip.

  • $ cd opencv-3.4.0

  • $ mkdir构建

  • $ CD构建

  • $ cmake -d cmake_build_type = reasels -d cmake_install_prefix = / usr / local -d install_c_examples = off -d build_examples =在-d with_gtk =上--d with_ffmpeg = off -d enable_precompiled_headers = OFF ..

遵循这些步骤编译并安装OpenCV:

  • $ make.

  • $ sudo make install

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

/usr/local/lib

和相关的标题被放置

/usr/local/include

配置代码生成参数

为EXE输出创建代码生成配置对象。

codegenArgs = createCodegenArgs ();

生成代码

调用Codegen命令。

流('->生成代码(可能需要几分钟)....\n');codegen (codegenArgs{:},文件名);%在代码生成期间,所有从属文件信息都存储在垫中%文件名为buildinfo.mat。
->生成代码(可能需要几分钟)....代码生成成功。

创建打包的zip文件

使用BuildInfo.mat中存储的构建信息以使用PackNgo创建ZIP文件夹。

流(->创建zip文件夹(可能需要几分钟)....\n');bInfo =负载(fullfile ('codegen'exe”“faceTrackingARMKernel”'buildinfo.mat'));packngo(binfo.buildinfo,{“packType”'等级'...'文件名'“faceTrackingARMKernel”});%生成的zip文件夹是faceTrackingARMKernel.zip
- >创建zip文件夹(可能需要几分钟)....

创建项目文件夹

将faceTrackingARMKernel.zip解压到一个名为FaceTrackingARM的文件夹中。解压缩所有文件并删除.zip文件。

packngoDir = hUnzipPackageContents ();
警告:目录已存在。

更新生成文件并复制到项目文件夹

faceTrackingARMMakefile Makefile。mk,本例中提供的是为Raspberry PI 2编写的,带有特定的优化标志。编写Makefile是为了在Linux环境中使用GCC和位于/usr/local/lib中的OpenCV库您可以根据您的目标配置更新Makefile。将Makefile文件复制到项目文件夹。

复制文件('faceTrackingarmakefile.mk', packngoDir);%也移动包含顶层文件夹中的主函数的文件。复制文件(“faceTrackingARMMain.c”, packngoDir);%为简单起见,请确保根目录名为matlab。SetrootDirectory(Packngodir);

手臂部署

在ARM上部署项目:

DISP('按照以下步骤在ARM上部署项目);
按照以下步骤在ARM上部署项目

将代码转移到ARM目标

使用首选文件传输工具将名为FaceTrackingarm的项目文件夹传输到ARM目标。由于覆盆子PI 2(带有Raspbian Stretch)已经有一个SSH服务器,您可以使用SFTP将文件从主机传输到目标。

对于此示例的官方部署,主机上安装了FileZilla SFTP客户端,并将项目文件夹从主机传输到/ home / pi / faceTrackarm覆盆子pi的文件夹。

DISP(“第一步:将文件夹“FaceTrackingARM”转移到你的ARM目标”);
步骤1:将文件夹“FaceTrackingArm”转移到ARM目标

在手臂上构建可执行文件

运行makefile以在ARM上构建可执行文件。对于覆盆子PI 2,(带Raspbian Stretch),打开命令线终端和“CD”到/ Home / Pi / FaceTrackArm。使用以下命令构建可执行文件:

make -f faceTrackingarmmakefile.mk.

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

DISP('step-2:使用shell命令构建可执行文件:make -f faceTrackingarmmakefile.mk');
步骤2:使用shell命令构建可执行文件:make -f faceTrackingarmmakefile.mk

在手臂上运行可执行文件

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

./facetrackingarmkernel.

请确保您使用窗口管理器连接到Raspberry Pi,而不仅仅是通过命令行终端,以避免与GTK相关的错误。这是显示跟踪窗口所必需的。

当可执行文件在Raspberry Pi2上运行时,要关闭视频查看器,请单击视频查看器并按下escape键。

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

附录 - 辅助功能

%配置编码器以创建可执行文件。邮政编码使用packNGo%生成阶段。功能codegenArgs = createCodegenArgs ()%创建代码生成所需的参数。%首先 - 创建配置对象%对于独立的可执行文件,需要一个主C函数。的为此示例创建的%faceTrackingArmMain.cc兼容含量faceTrackingArmkernel.m的文件内容maincfile =“faceTrackingARMMain.c”%包括帮助函数camCPPFile ='helperopencvwebcam.cpp';viewerCPPFile ='helperopencvvideoviewer.cpp'%用空格处理路径如果包含(maincfile,' 'maincfile = [“””maincfile.“””];camCPPFile = [“””camCPPFile“””];viewerCPPFile = [“””viewerCPPFile“””];结尾%创建配置对象cfg = coder.config(exe”);cfg。CustomSource = sprintf (' % s \ n % s \ n % s的,maincfile,camcppfile,diewercppfile);cfg.custominclude = PWD;%设置生产硬件为ARM,以生成ARM兼容的可移植代码cfg.hardwareimplingation.prodhwdeviceType =.'ARM兼容 - > ARM CORTEX';cfg.enableopenmp = false;%创建输入参数inrgb_type = coder.typeof(uint8(0),[480 640 3]);%使用'-c'选项生成C代码而无需调用C ++编译器。codegenArgs = {'-config',cfg,'-C'“参数”, {inRGB_type}};结尾%解压打包的zip文件功能packngodir = hunzippackageContents()packngodirname =“FaceTrackingARM”%create packngo目录mkdir(packngodirname);%获取PackNgo生成的单个zip文件的名称zipfile = dir(‘* . zip”);断言(Numel(ZipFile)== 1);解压缩(zipfile.name,packngodirname);%unzip内部zip文件在分层packngo中创建zipfileinternal = dir(fullfile(packngodirname,‘* . zip”));为了i = 1:numel(zipfileinternal)解压缩(fullfile(packngodirname,zipfileinternal(i).name),...packngodirname);结尾%删除内部zip文件删除(fullfile (packngoDirName‘* . zip”));packngoDir = fullfile (packngoDirName);结尾%将根目录设置为matlab功能setRootDirectory(packngoDir) dirList = dir(packngoDir);如果isempty(找到(ismember({dirlist.name},'matlab'),1))%根目录不是matlab。改成matlab为了i=1:length(dirList) thisDir = fullfile(packngoDir,dirList(i).name),'工具箱'“愿景”);如果isfolder (thisDir)重命名目录movefile(fullfile(packngodir,dirlist(i).name),...fullfile(Packngodir,'matlab'));休息结尾结尾结尾结尾
结尾