主要内容

阅读视频文件英伟达硬件

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

视频文件的Sobel边缘检测

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

需求

  1. GPU编码器。

  2. NVIDIA Jetson金宝app和NVIDIA DRIVE平台的MATLAB编码器支持包

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

  4. NVIDIA CUDA工具包。

  5. 目标上的GStreamer和SDL库。

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

  7. NVIDIA 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-1 SDL版本:1.2 OpenCV版本:4.1.1可用网络摄像头: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 = hwobj.imageDisplay;从视频管道抓取帧vObj。hasFrame img = vObj.readFrame();%索贝尔边缘检测Kernel = [1 2 1;0 0 0; -2 -1];H = conv2(img(:,:,2),内核,“相同”);V = conv2(img(:,:,2),kernel',“相同”);E =根号下(h。*h + v *v);edgeImg = uint8((e > 100) * 240);显示边缘检测图像图像(dispObj edgeImg);结束结束

对于代码生成,使用VideoReader函数需要目标硬件上视频文件的完整路径。的NVIDIA Jetson金宝app和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++ main函数并编译。这个例子不需要修改生成的主文件。使用putFile方法杰森对象将输入视频文件移动到目标平台。

cfg = code . gpuconfig (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 = hwobj.imageDisplay;从视频管道抓取帧vObj。hasFrame img = vObj.readFrame();%索贝尔边缘检测Kernel = [1 2 1;0 0 0; -2 -1];H = conv2(img(:,:,2),内核,“相同”);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);} // //参数: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 . gpuconfig (exe”);cfg。硬件= code . Hardware (英伟达杰森的);cfg.Hardware.BuildDir =“~ / remoteBuildDir”;cfg。CustomSource =“main.cu”

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

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

限制

另请参阅

功能

对象

相关的例子

更多关于