这个例子展示了如何使用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++编译器的权限,并且你必须使用'mex -setup c++'命令配置它。有关更多信息,请参见选择一个c++编译器.
MATLAB Coder要求MATLAB代码以函数的形式生成C代码。这个示例的主要算法代码驻留在一个被调用的函数中faceDetectionARMKernel.m.该函数从网络摄像头拍摄图像,作为输入。该功能用围绕检测到的面部输出具有边界框的图像。输出图像将显示在视频查看器窗口上。要了解如何修改MATLAB代码以使其兼容代码生成,可以查看示例引入特征匹配和注册的代码生成.
文件名=“faceDetectionARMKernel.m”;
对于一个独立的可执行目标,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 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。
->生成代码(可能需要几分钟)....代码生成成功。
使用存储在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上部署项目
使用您首选的文件传输工具将您名为FaceDetectionARM的项目文件夹转移到您的ARM目标。由于Raspberry Pi 2(带Raspbian Stretch)已经有了一个SSH服务器,你可以使用SFTP从主机传输文件到目标。
对于本示例的正式部署,需要在主机上安装FileZilla SFTP Client,并将项目文件夹从主机传输到/home/pi/FaceDetectionARM覆盆子pi的文件夹。
disp (“第一步:将文件夹“FaceDetectionARM”转移到你的ARM目标”);
步骤1:转移文件夹“FaceDetectionARM”到你的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
运行上面步骤中生成的可执行文件。对于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。改成matlab为i=1:length(dirList) thisDir = fullfile(packngoDir,dirList(i).name),'工具箱',“愿景”);如果isfolder (thisDir)重命名目录移动文件(fullfile (packngoDir、目录(i) . name),...fullfile(Packngodir,matlab的));打破;结束结束结束结束
结束