主要内容

跟踪的脸(树莓皮)

这个例子展示了如何使用MATLAB®编码器™从MATLAB生成C代码文件和部门目标系统上部署应用程序。

从摄像头读取视频帧的例子。它检测到一个面临使用Viola-Jones人脸检测算法和跟踪使用KLT算法在视频直播。最终显示帧的边界框和一组标记在面临被跟踪。网络摄像头功能,从MATLAB支持USB摄像头包,和放像机对象,从计万博1manbetx算机视觉系统工具箱™,用于MATLAB主机上仿真。这两个函数不支持部门的目标,所以读者OpenCV-万博1manbetxbased摄像头和视频查看器函数用于部署。

目标必须有OpenCV 3.4.0版本库(用GTK)和一个标准的c++编译器。覆盆子π2 Raspbian拉伸操作系统是用于部署。这个例子应该在任何部门工作目标。

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

这个例子是一个函数与顶部的主体和辅助例程的形式嵌套函数在下面。

函数FaceTrackingARMCodeGenerationExample ()

设置你的c++编译器

要运行这个示例,您必须访问一个c++编译器,您必须配置使用的墨西哥人设置c++的命令。有关更多信息,请参见选择一个c++编译器

打破算法的计算部分到一个单独的MATLAB函数

MATLAB编码器需要MATLAB代码是一个函数的形式,以生成C代码。这个例子的主要算法的代码驻留在一个函数调用faceTrackingARMKernel.m。函数从一个摄像头获取图像,作为输入。函数输出图像的边界框和一组标记的脸。输出的图像将显示在视频查看器窗口。学习如何修改MATLAB代码兼容的代码生成,你可以看看介绍代码生成功能匹配和登记

文件名=“faceTrackingARMKernel.m”;

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

对于一个独立的可执行目标,MATLAB编码器要求您创建一个C文件包含一个函数命名为“主”。这个示例使用faceTrackingARMMain。c文件。这个主要功能在这个文件中执行以下任务:

  • 从摄像头中读取视频帧

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

  • 显示输出帧包含边界框和标记的脸

对MATLAB模拟主机,在faceTrackingARMMain执行的任务。在faceTrackingARMMain.m c文件实现

读者摄像头和视频查看器

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

  • helperOpenCVWebcam.hpp

  • helperOpenCVWebcam.cpp

  • helperOpenCVVideoViewer.cpp

  • helperOpenCVVideoViewer.hpp

MATLAB主机上仿真的例子使用了摄像头功能从MATLAB支持USB摄像头方案,从计算机视觉系统工具箱的放像机对象。万博1manbetx在MATLAB上运行模拟主机通过输入faceTrackingARMMain MATLAB®命令行。

OpenCV为部门目标

本例要求您安装OpenCV 3.4.0库在手臂的目标。视频查看器需要构建highgui图书馆OpenCV的GTK手臂的目标。

按以下步骤下载并构建OpenCV 3.4.0覆盆子π2与预装Raspbian延伸。你必须更新系统固件或根据需要安装其他开发工具和软件包为您的系统配置在你开始建筑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.zip美元https://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 =释放- d CMAKE_INSTALL_PREFIX = / usr /地方- d INSTALL_C_EXAMPLES = - d BUILD_EXAMPLES = - d - d WITH_FFMPEG WITH_GTK = =关闭- d ENABLE_PRECOMPILED_HEADERS =了. .

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

  • 让美元

  • $ sudo make install

对于正式部署示例,OpenCV图书馆是安装在下列目录树莓π2:

/usr/local/lib

和相关的头被安置在

/usr/local/include

代码生成配置参数

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

codegenArgs = createCodegenArgs ();

生成代码

调用codegen命令。

流(”- >“生成代码(可能需要几分钟).... \ n”);codegen (codegenArgs{:},文件名);%在代码生成过程中,所有依赖文件信息存储在一个垫子文件名为buildInfo.mat %。
- >生成代码(可能需要几分钟)....代码生成成功。

创建压缩文件打包

使用构建信息存储在buildInfo。垫使用packNGo创建一个压缩文件夹。

流(“- >创建zip文件夹(可能需要几分钟).... \ n”);bInfo =负载(fullfile (“codegen”,exe”,“faceTrackingARMKernel”,“buildInfo.mat”));packNGo (bInfo。buildInfo, {“packType”,“分层”,“文件名”,“faceTrackingARMKernel”});% faceTrackingARMKernel.zip生成的压缩文件夹
- >创建zip文件夹(可能需要几分钟)....

创建项目文件夹

解压缩faceTrackingARMKernel。压缩到一个文件夹命名为FaceTrackingARM。解压所有文件和删除. zip文件。

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

更新Makefile,并复制到项目文件夹中

faceTrackingARMMakefile Makefile。可,只要在这个例子中是写给覆盆子π2与特定的优化旗帜。Makefile写使用GCC在Linux环境中,您位于/usr/local/lib. OpenCV库你可以基于你的目标配置更新Makefile。Makefile文件复制到项目文件夹中。

拷贝文件(“faceTrackingARMMakefile.mk”,packngoDir);%也移动文件包含顶级文件夹中的主要功能。拷贝文件(“faceTrackingARMMain.c”,packngoDir);%为简单起见,确保根目录的名字是matlab。setRootDirectory (packngoDir);

部署在手臂

手臂上部署您的项目:

disp (按照下面的步骤来部署您的项目部门的);
按照下面的步骤来部署您的项目在手臂

代码转移到部门目标

你的项目文件夹命名FaceTrackingARM转给你的手臂目标使用你喜欢的文件传输工具。自从覆盆子π2 (Raspbian拉伸)已经有了一个SSH服务器,您可以使用SFTP将文件从主机转移到目标。

正式部署的这个例子中,FileZilla SFTP客户端安装在主机上,从主机转移到项目文件夹/home/pi/FaceTrackingARM文件夹树莓π。

disp (步骤1:将文件夹“FaceTrackingARM”你的手臂目标”);
步骤1:将文件夹“FaceTrackingARM”你的手臂的目标

建立可执行的手臂

手臂上运行makefile构建可执行。对树莓π2 (Raspbian拉伸),打开一个命令行终端,/home/pi/FaceTrackingARM“cd”。使用以下命令构建可执行:

让- f faceTrackingARMMakefile.mk

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

disp (步骤2:构建可执行部门使用shell命令:让- f faceTrackingARMMakefile.mk”);
步骤2:构建可执行手臂使用shell命令:- f faceTrackingARMMakefile.mk

手臂上运行的可执行文件

运行在上面的步骤中生成的可执行文件。对树莓π2 (Raspbian拉伸),使用下面的命令shell窗口中:

。/ faceTrackingARMKernel

确保你连接的覆盆子π的窗口管理器,而不只是通过一个命令行终端,避免错误与GTK有关。这是必要的跟踪窗口出现。

关闭视频查看器可执行文件运行时在树莓皮,点击视频查看器,按escape键。

disp (步骤3:在手臂上运行可执行使用shell命令:。/ faceTrackingARMKernel”);
步骤3:在手臂上运行可执行使用shell命令:/ faceTrackingARMKernel

附录-辅助函数

%配置编码器来创建可执行的。使用packNGo邮政编码%生成阶段。函数codegenArgs = createCodegenArgs ()%创建代码生成所需参数。%首先——创建配置对象%%为独立的可执行的一个主要的C函数是必需的。的% faceTrackingARMMain。c创建这个示例是兼容的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的,camCPPFile mainCFile viewerCPPFile);cfg。CustomInclude = pwd;%设置生产硬件的手臂来生成手臂兼容的可移植代码cfg.HardwareImplementation。ProdHWDeviceType =“胳膊兼容- >手臂皮层”;cfg。EnableOpenMP = false;%创建输入参数inRGB_type = coder.typeof (uint8 (0) (480 640 3]);%使用“C”选项来生成C代码没有调用c++编译器。codegenArgs = {“配置”cfg,“c”,“参数”,{inRGB_type}};结束% zip文件解压缩打包函数packngoDir = hUnzipPackageContents () packngoDirName =“FaceTrackingARM”;%创建packngo目录mkdir (packngoDirName);%得到单个zip文件的名称由packngo生成的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 = fullfile (packngoDirName);结束%根目录设置为matlab函数setRootDirectory (packngoDir)目录= dir (packngoDir);如果isempty (find (ismember ({dirList.name},matlab的),1))%根目录不是matlab。将其更改为matlabi = 1:长度(目录)thisDir = fullfile (packngoDir、目录(我). name,“工具箱”,“愿景”);如果isfolder (thisDir)%重命名dir移动文件(fullfile (packngoDir、目录(i) . name),fullfile (packngoDirmatlab的));打破;结束结束结束结束
结束