主要内容

阅读视频文件英伟达硬件

MATLAB®NVIDIA的金宝appCoder™支持包®杰森®和NVIDIA驱动器®平台,可以生成CUDA®MATLAB代码VideoReader对象读取NVIDIA目标硬件上包含视频数据的文件。生成的代码使用GStreamer库API读取视频文件。

视频文件的Sobel边缘检测

在本例中,使用GPU Coder™和针对NVIDIA Jets金宝appon和NVIDIA DRIVE平台的MATLAB编码器支持包在Jetson TX2板上为Sobel边缘检测应用程序生成和部署CUDA可执行文件。这个CUDA应用程序读取视频文件的内容,执行边缘检测操作,并在NVIDIA硬件上显示输出视频。

需求

  1. GPU编码器。

  2. 针对NVIDIA Jets金宝appon和NVIDIA DRIVE平台的MATLAB编码器支持包

  3. 图像处理工具箱™的工具箱rhinos.avi本例中使用的示例视频文件。

  4. NVIDIA CUDA工具包。

  5. 目标上的GStreamer和SDL库。

  6. 主机和目标上的编译器和库的环境变量。有关更多信息,请参见第三方硬件(GPU编码器)环境变量(GPU编码器),NVIDIA板安装和设置先决条件

  7. 英伟达Jetson TX2嵌入式平台。

创建活动硬件连接对象

支持包软金宝app件使用TCP/IP上的SSH连接来执行命令,同时在Jetson平台上构建和运行生成的CUDA代码。将目标平台连接到与主机相同的网络。您也可以使用以太交叉网线将单板直接连接到主机。关于如何设置和配置您的板,请参阅NVIDIA文档。

方法来与NVIDIA硬件通信,必须创建活动硬件连接对象杰森函数。若要创建活动硬件连接对象,请提供目标板的主机名或IP地址、用户名和密码。例如,为Jetson硬件创建活动对象:

Hwobj = jetson('jetson-tx2-name','ubuntu','ubuntu');

该软件执行硬件、编译工具和库、IO服务器安装的检查,并收集与目标连接的外设的信息。该信息显示在命令窗口中,如所示。

正在检查目标上的CUDA可用性…正在检查目标系统路径中的'nvcc'…正在检查目标上cuDNN库的可用性…检查目标上的TensorRT库可用性…前提库的检查已经完成。收集硬件细节…正在检查目标上的第三方库可用性…完成硬件详细信息的收集。单板名称:NVIDIA Jetson TX2 CUDA版本:10.0 cuDNN版本:7.6 TensorRT版本:6.0 GStreamer版本:1.14.5 V4L2版本:1.14.2- SDL版本:1.2 OpenCV版本:4.1.1可用webcam: Microsoft®LifeCam Cinema(TM)可用gpu: NVIDIA Tegra X2

或者,为DRIVE硬件创建活动对象:

Hwobj = drive('drive-px2-name','ubuntu','ubuntu');

请注意

如果有一个连接失败,一个诊断错误信息报告在MATLAB命令行。连接失败最可能的原因是目标器的IP地址或主机名不正确。

videoReaderDeploy入口点函数

创建一个MATLAB文件videoReaderDeploy.m它充当代码生成的入口点函数。的videoReaderDeploy.m函数创建一个VideoReader对象被称为vObj阅读rhinos.avi位于目标硬件上的视频文件。函数然后使用hasFrame而且readFrame的方法VideoReader对象从输入文件中确定并读取有效的视频帧。该函数通过二维空间梯度运算进行Sobel边缘检测,并将检测到的边缘图像显示在目标硬件上。该函数用各自的Sobel核找到输入图像的水平梯度(h)和垂直梯度(v)。

函数videoReaderDeploy ()%创建Jetson硬件对象Hwobj = jetson();vidName =“/ home / ubuntu /视频/ rhinos.avi”创建视频阅读器对象vObj = videereader (hwobj,vidName,“宽度”, 320,“高度”, 240);在目标上创建显示对象dispObj = hobj . imagedisplay;从视频管道中抓取帧vObj。hasFrame img = vObj.readFrame();索贝尔边缘检测Kernel = [1 2 1;0 0 0;-1 2 -1];H = conv2(img(:,:,2),kernel,“相同”);V = conv2(img(:,:,2),kernel',“相同”);E =√(h。*h + v *v);edgeImg = uint8((e > 100) * 240);显示边缘检测到的图像图像(dispObj edgeImg);结束结束

对于代码生成,VideoReader函数需要目标硬件上视频文件的完整路径。的针对NVIDIA Jets金宝appon和NVIDIA DRIVE平台的MATLAB编码器支持包使用GStreamer库API读取目标平台上的视频文件。该软件支持与GStream金宝apper兼容的文件(容器)格式和编解码器。有关更多信息,请参见https://gstreamer.freedesktop.org/documentation/plugin-development/advanced/media-types.html?gi-language=c.的其他代码生成限制VideoReader功能,请参阅限制

生成CUDA可执行的使用GPU编码器

创建用于生成可执行文件的GPU代码配置对象。使用coder.hardware函数为Jetson平台创建一个配置对象,并将其分配给硬件的代码配置对象cfg.使用BuildDir属性以指定在目标上执行远程生成过程的文件夹。如果指定的构建文件夹在目标上不存在,那么软件将创建一个具有给定名称的文件夹。如果没有赋值给cfg.Hardware.BuildDir,则远程生成过程发生在最后指定的生成文件夹中。如果没有存储生成文件夹值,则生成过程将在主文件夹中进行。设置GenerateExampleMain属性生成CUDA c++主函数示例并编译。这个示例不需要修改生成的主文件。使用putFile的方法杰森对象将输入视频文件移动到目标平台。

cfg = code .gpu config (exe”);cfg。硬件= code . Hardware (英伟达杰森的);cfg.Hardware.BuildDir =“~ / remoteBuildDir”;cfg。GenerateExampleMain =“GenerateCodeAndCompile”;hwobj.putFile (“犀牛”, hwobj.workspaceDir);

要生成CUDA代码,请使用codegen命令,并将GPU代码配置对象与videoReaderDeploy入口点函数。在主机上生成代码之后,将复制生成的文件并构建在目标上。

codegen (“配置”cfg,“videoReaderDeploy”“报告”);

运行可执行程序

要在目标硬件上运行可执行文件,请使用runApplication方法的硬件对象。在MATLAB命令窗口中,输入:

pid = runApplication(hwobj,“videoReaderDeploy”);

目标硬件显示器上打开一个窗口,显示输入视频的边缘检测输出。

在运行时指定视频文件

您可以修改入口点函数和代码配置对象,以在运行可执行文件时接受可变文件名,而不是在代码生成时指定视频文件。

函数videoReaderDeploy (vfilename)%创建Jetson硬件对象Hwobj = jetson();创建视频阅读器对象vObj = videereader (hwobj,vfilename,“宽度”, 640,“高度”, 480);在目标上创建显示对象dispObj = hobj . imagedisplay;从视频管道中抓取帧vObj。hasFrame img = vObj.readFrame();索贝尔边缘检测Kernel = [1 2 1;0 0 0;-1 2 -1];H = conv2(img(:,:,2),kernel,“相同”);V = conv2(img(:,:,2),kernel',“相同”);E =√(h。*h + v *v);edgeImg = uint8((e > 100) * 240);显示边缘检测到的图像图像(dispObj edgeImg);结束结束

创建一个自定义的主文件来处理运行可执行文件时输入的变量文件名。下面显示了代码片段。

静态无效main_videoReaderDeploy(const char* const vfilename) {videoReaderDeploy(vfilename);} // // Arguments: int32_T argc // const char * const argv[] //返回类型:int32_T // int32_T main(int32_T, const char * const argv[]){//初始化应用videoReaderDeploy_initialize();//调用入口点函数main_videoReaderDeploy(argv[1]);//终止应用程序videoReaderDeploy_terminate();返回0;}

修改代码配置对象以包括这个自定义主文件。

cfg = code .gpu config (exe”);cfg。硬件= code . Hardware (英伟达杰森的);cfg.Hardware.BuildDir =“~ / remoteBuildDir”;cfg。CustomSource =“main.cu”

要生成CUDA代码,请使用codegen命令,并将GPU代码配置对象与videoReaderDeploy入口点函数。

Vfilename = code .typeof(“一个”[1024]);codegen (“配置”cfg,“参数”{vfilename},“videoReaderDeploy”“报告”);

限制

另请参阅

功能

对象

相关的例子

更多关于