主要内容

检测面部(覆盆子PI2)

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

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

目标必须有OpenCV 3.4.0版本的库(用GTK构建)和标准的c++编译器。部署时使用了带有Raspberry Pi 2和Raspbian Stretch操作系统。该示例应该适用于任何ARM目标。

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

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

功能FaceDetectionARMCodeGenerationExample ()

建立你的c++编译器

要运行这个例子,你必须有一个c++编译器的权限,并且你必须使用'mex -setup c++'命令配置它。有关更多信息,请参见选择一个c++编译器

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

MATLAB Coder要求MATLAB代码以函数的形式生成C代码。这个示例的主要算法代码驻留在一个被调用的函数中faceDetectionARMKernel.m.该函数从网络摄像头拍摄图像,作为输入。该功能用围绕检测到的面部输出具有边界框的图像。输出图像将显示在视频查看器窗口上。要了解如何修改MATLAB代码以使其兼容代码生成,可以查看示例引入特征匹配和注册的代码生成

文件名=“faceDetectionARMKernel.m”

创建具有I/O功能的主要功能

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

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

  • 将视频帧发送给人脸检测算法

  • 显示输出帧,包含检测到的面周围的包围框

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

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

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

  • helperOpenCVWebcam.hpp

  • helperopencvwebcam.cpp.

  • helperOpenCVVideoViewer.cpp

  • helperopencvvideoviewer.hpp.

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

针对ARM目标的OpenCV

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

按照以下步骤下载并在Raspberry Pi 2上预装Raspbian Stretch构建OpenCV 3.4.0。在开始构建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.ziphttps://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 = 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 =关闭..

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

  • 让美元

  • $ 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”“faceDetectionARMKernel”“buildInfo.mat”));packngo(binfo.buildinfo,{“packType”“分层”...“文件名”“faceDetectionARMKernel”});%生成的zip文件夹为faceDetectionARMKernel.zip
->创建zip文件夹(可能需要几分钟)....

创建项目文件夹

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

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

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

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

拷贝文件(“faceDetectionARMMakefile.mk”, packngoDir);也将包含main函数的文件移动到顶层文件夹中。拷贝文件(“faceDetectionARMMain.c”, packngoDir);%为简单起见,请确保根目录名为matlab。SetrootDirectory(Packngodir);

部署在手臂

在ARM上部署你的项目:

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

将代码转移到ARM目标

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

对于本示例的正式部署,需要在主机上安装FileZilla SFTP Client,并将项目文件夹从主机传输到/home/pi/FaceDetectionARM覆盆子pi的文件夹。

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

在ARM上构建可执行文件

运行makefile以在ARM上构建可执行文件。对于Raspberry Pi 2,(带Raspbian Stretch),打开Linux Shell和CD到/ Home / Pi / FacedetectionArm。使用以下命令构建可执行文件:

make -f facedetectionArmmakefile.

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

disp ('步骤2:使用shell命令在ARM上构建可执行文件:make -f faceDetectionARMMakefile.mk');
步骤2:使用shell命令构建可执行文件:make -f facedetectionarmmakefile.mk

在ARM上运行可执行文件

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

./facedetectionArmkernel.

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

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

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

附录 - 辅助功能

%配置编码器以创建可执行文件。邮政编码使用packNGo%生成阶段。功能codegenArgs = createCodegenArgs ()%创建代码生成所需的参数。%首先 - 创建配置对象%对于独立的可执行文件,需要一个主C函数。的为这个例子创建的% faceDetectionARMMain.c是兼容的%带有文件faceDetectionARMKernel.m的内容mainCFile =“faceDetectionARMMain.c”%包括帮助函数camCPPFile ='helperopencvwebacam.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.HardwareImplementation.ProdHWDeviceType =“胳膊兼容- >部门皮层”;cfg.enableopenmp = false;创建输入参数inRGB_type = code .typeof(uint8(0),[480 640 3]);%使用'-c'选项生成C代码而不调用c++编译器。codegenArgs = {“配置”cfg,'-C'“参数”, {inRGB_type}};结束%解压打包的zip文件功能packngodir = hunzippackageContents()packngodirname =“FaceDetectionARM”创建packngo目录mkdir(packngodirname);%获取由packngo生成的单个zip文件的名称zipfile = dir(‘* . zip”);断言(元素个数(zipFile) = = 1);解压缩(zipFile.name packngoDirName);解压分层packNGo中创建的内部zip文件zipFileInternal = dir (fullfile (packngoDirName‘* . zip”));i = 1:元素个数(zipFileInternal)解压缩(fullfile (packngoDirName, zipFileInternal (i) . name),...packngoDirName);结束%删除内部zip文件删除(fullfile (packngoDirName‘* . zip”));packngoDir = packngoDirName;结束%将根目录设置为matlab功能setRootDirectory(packngoDir) dirList = dir(packngoDir);如果isempty (find (ismember ({dirList.name},matlab的), 1))%根目录不是matlab。改成matlabi=1:length(dirList) thisDir = fullfile(packngoDir,dirList(i).name),'工具箱'“愿景”);如果isfolder (thisDir)重命名目录移动文件(fullfile (packngoDir、目录(i) . name),...fullfile(Packngodir,matlab的));打破结束结束结束结束
结束