此示例显示如何使用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 ++编译器,您必须使用'mex -setup c ++'命令配置它。有关更多信息,请参阅选择C ++编译器。
MATLAB编码器需要MATLAB代码以函数的形式才能生成C代码。此示例的主要算法的代码驻留在一个调用的函数中faceTrackingARMKernel.m。该函数从网络摄像头拍摄图像,作为输入。该功能用边界框输出图像和脸部周围的一组标记。输出图像将显示在视频查看器窗口上。要了解如何修改MATLAB代码以使其兼容代码生成,可以查看示例具有功能匹配和注册的代码生成简介。
filename ='faceTrackingarmkernel.m';
对于一个独立的可执行目标,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主机上运行模拟。
此示例要求您在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。
- >生成代码(可能需要几分钟)....代码生成成功。
使用存储在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,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上部署项目
使用您首选的文件传输工具将名为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
运行上述步骤中生成的可执行文件。对于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'));打破;结尾结尾结尾结尾
结尾