主要内容

为加载自定义地面真实数据源创建类

地面实况贴标签机应用程序,您可以从图像和点云数据源标记信号。这些来源包括视频,图像序列,点云序列,Velodyne®PCAP (packet capture)文件和rosbags文件。要加载应用程序本身不支持的数据源,可以创建一个类来加载该数据源到应用程序中。金宝app

该示例演示如何使用预定义的数据源类之一,该类将数据源中的信号加载到地面实况贴标签机应用:vision.labeler.loading.PointCloudSequenceSource类。应用程序使用这个特定的类从文件夹中加载点云数据(PCD)或多边形(PLY)文件序列。

首先,打开vision.labeler.loading.PointCloudSequenceSource类。使用为该类描述的属性和方法来帮助您编写自己的自定义类。

编辑vision.labeler.loading.PointCloudSequenceSource

自定义类文件夹

地面实况贴标签机应用程序识别数据源类只有当这些文件在+视觉/ +贴标签机/ +加载文件夹,在MATLAB中®搜索路径。

vision.labeler.loading.PointCloudSequenceSource类和其他预定义的数据源类存储在此文件夹中。

草根\工具箱\ \视力\ +视觉\ +贴标签机\ +加载

在这条路,草根是MATLAB文件夹的根目录。

将创建的数据源类保存到此文件夹中。或者,创建你自己的+视觉/ +贴标签机/ +加载文件夹,将其添加到MATLAB搜索路径中,并将类保存到此文件夹中。

类定义

数据源类必须继承vision.labeler.loading.MultiSignalSource班查看的类定义vision.labeler.loading.PointCloudSequenceSource类。

classdefPointCloudSequenceSource < vision.labeler.loading.MultiSignalSource

将点云序列信号加载到地面实况贴标签机应用程序,应用程序创建一个类的实例,即PointCloudSequenceSource对象在应用程序中标记此信号后,当导出标签时,导出的groundTruthMultisignal对象存储PointCloudSequenceSource对象在其数据源财产。

定义数据源类时,请替换PointCloudSequenceSource使用自定义数据源类的名称。

类属性

数据源类必须定义这些抽象的常量属性。

  • 的名字—指定数据源类型的字符串标量

  • 描述-描述类的字符串标量

地面实况贴标签机当你从“添加/删除信号”对话框中加载信号时的名字字符串作为选项显示在源类型参数。这个图显示了的名字字符串的vision.labeler.loading.PointCloudSequenceSource类。

描述字符串不出现在对话框中。然而,这两个的名字描述字符串作为只读属性存储在此类的实例中。

下面的代码显示的名字财产字符串的vision.labeler.loading.PointCloudSequenceSource类。

properties (Constant) Name =“点云序列”描述=“点云序列读取器”结束

在定义数据源类时,定义的名字描述属性值以匹配自定义数据源的名称和说明。您还可以定义特定于加载数据源的任何其他私有属性。源的源特定属性vision.labeler.loading.PointCloudSequenceSource类没有显示在本示例中,但您可以在类文件中查看它们。

方法以自定义加载面板

在数据源类中,customizeLoadPanel方法控制在应用程序的添加/删除信号对话框中加载信号面板的显示面板对象创建的uipanel函数。面板包含从数据源加载信号所需的参数和控件。

的加载面板vision.labeler.loading.PointCloudSequenceSource类。在源类型列表,当您选择点云序列,该应用程序调用customizeLoadPanel方法并加载点云序列的面板。

下面的代码显示customizeLoadPanel方法vision.labeler.loading.PointCloudSequenceSource类。它使用computePositions方法计算必须放置文本、按钮和参数等UI组件的位置值。的addUIComponents方法然后通过添加相应的UI组件来定义面板。有关这些方法的完整实现,请参阅vision.labeler.loading.PointCloudSequenceSource类。

函数customizeLoadPanel(面板)。面板=面板;computePositions(这个);addUIComponents(这个);结束

在开发此方法或其他数据源方法时,可以使用静态方法loadPanelChecker预览自定义数据源的“加载”对话框的显示和功能。此方法不需要打开应用程序会话即可使用。例如,使用loadPanelChecker方法与vision.labeler.loading.PointCloudSequence类。

vision.labeler.loading.PointCloudSequenceSource.loadPanelChecker

获取加载面板数据和加载数据源的方法

在“添加/删除信号”对话框中,浏览信号后,设置必要的参数,然后单击添加源时,应用程序会连续调用这两个方法。

  • getLoadPanelData-将数据输入面板。

  • loadSource-将数据加载到应用程序中。

这个图显示了这些方法和添加源按钮加载点云序列信号时使用vision.labeler.loading.PointCloudSequenceSource类。

定义自定义数据源时,必须定义getLoadPanelData方法,该方法返回这些输出。

  • sourceName—数据源的名称

  • sourceParams-一个结构,包含装载数据源所需信息的字段

下面的代码显示getLoadPanelData方法vision.labeler.loading.PointCloudSequenceSource类。该方法集sourceName输入的名字文件夹名称对话框的参数和sourceParams一个空的结构。如果时间戳参数设置为从工作空间并且加载了时间戳,然后应用程序用这些时间戳填充这个结构。

函数[sourceName, sourceParams] = getLoadPanelData(this) sourceParams = struct();如果isUIFigureBased(this) sourceName = string(this. folderpathbox . value);其他的sourceName =字符串(this.FolderPathBox.String);结束结束

您还必须定义loadSource方法。这种方法必须采取sourceNamesourceParams从机场回来getLoadPanelData方法作为输入。这个方法还必须填充这些属性,这些属性存储在应用程序创建的数据源对象的实例中。

  • SignalName-数据源中每个信号的字符串标识符

  • SignalType-数组vision.labeler.loading.SignalType定义数据源中每个信号的类型的枚举

  • 时间戳-数据源中每个信号的时间戳矢量或单元数组

  • 源名称—数据源的名称

  • SourceParams-一个结构,包含装载数据源所需信息的字段

下面的代码显示loadSource方法vision.labeler.loading.PointCloudSequenceSource类。这个方法执行这些操作。

  1. 检查点云序列有正确的扩展,并保存读取点云所需的信息到fileDatastore对象

  2. 设置时间戳属性。

    • 如果时间戳是从工作区变量加载的(时间戳从工作空间),然后该方法设置时间戳的时间戳sourceParams输入。

    • 如果时间戳是从点云序列本身派生的(时间戳使用默认),然后该方法设置时间戳持续时间秒向量,每点云一秒。

  3. 验证加载的点云序列。

  4. 设置SignalName属性设置为数据源文件夹的名称。

  5. 设置SignalType财产PointCloud信号类型。

  6. 设置源名称SourceParams属性到sourceNamesourceParams分别输出。

函数loadSource (sourceName, sourceParams)%加载文件ext = {“.pcd”“每”};这一点。pcd = fileDatastore (sourceName,“ReadFcn”,@pcread,“文件扩展名”,分机);%填充时间戳如果isempty (this.Timestamp)如果isfield (sourceParams“时间戳”) setTimestamps(这sourceParams.Timestamps);其他的这一点。时间戳={秒(0:1:元素个数(this.Pcds.Files) 1) '};结束其他的如果~ iscell (this.Timestamp)。时间戳= {this.Timestamp};结束结束进口vision.internal.labeler.validation。*checkPointCloudSequenceAndTimestampsAgreement (this.Pcds this.Timestamp {1});%填充信号名称和类型[~, folderName, ~] = fileparts(sourceName);这一点。SignalName = makeValidName(this, string(folderName),“pointcloudSequence_”);这一点。SignalType = vision.labeler.loading.SignalType.PointCloud;这一点。SourceName = SourceName;这一点。SourceParams = SourceParams;结束

读取帧的方法

必须定义的最后一个必需方法是readFrame方法。此方法从存储在数据源中的信号中读取帧。每次导航到新帧时,应用程序都会调用这个方法。中特定时间戳的索引时间戳属性传递给此方法。

下面的代码显示readFrame方法vision.labeler.loading.PointCloudSequenceSource类。该方法从点云序列中读取帧pcread函数。

函数frame = readFrame(this, signalName, index)如果~strcmpi(signalName,this.signalName)帧=[];其他的帧= pcread (this.Pcds.Files{指数});结束结束

您还可以定义任何附加的私有属性,这些属性是特定于加载数据源的。的源特定方法vision.labeler.loading.PointCloudSequenceSource类没有显示在本示例中,但您可以在类文件中查看它们。

使用预定义的数据源类

这个例子展示了如何使用vision.labeler.loading.PointCloudSequenceSource类来帮助您创建自己的自定义类。此表显示了可以用作自己类起点的数据源类的完整列表。

由类加载的数据源 查看类源代码的命令
vision.labeler.loading.VideoSource 视频文件
编辑vision.labeler.loading.VideoSource
vision.labeler.loading.ImageSequenceSource 图像序列的文件夹
编辑vision.labeler.loading.ImageSequenceSource
vision.labeler.loading.VelodyneLidarSource Velodyne数据包捕获(PCAP)文件
编辑vision.labeler.loading.VelodyneLidarSource
vision.labeler.loading.RosbagSource Rosbag文件
编辑vision.labeler.loading.RosbagSource
vision.labeler.loading.PointCloudSequenceSource 点云序列文件夹
编辑vision.labeler.loading.PointCloudSequenceSource
vision.labeler.loading.CustomImageSource 自定义图像格式
编辑vision.labeler.loading.CustomImageSource

另请参阅

应用程序

对象