主要内容

创建和执行回调函数

介绍

使用事件回调的强大之处在于您可以在响应事件时执行处理。您可以决定要将回调与哪些事件关联,以及这些回调执行哪些函数。

本节

请注意

如果回调涉及cpu密集型任务(如更新图形),则回调函数的执行可能会延迟。

创建回调函数

的回调函数TimerFcnFramesAcquiredFcnStartFcnStopFcnTriggerFcn,ErrorFcn回调。

回调函数至少需要两个输入参数:

  • 图像采集对象

  • 与事件关联的事件结构

这个回调函数的函数头说明了这个基本语法。

函数mycallback (obj、事件)

第一个参数,obj,是图像采集对象本身。因为对象是可用的,所以您可以在回调函数中使用任何工具箱函数,例如getdata,它要求对象作为参数。您还可以访问所有对象属性。

第二个参数,事件,是与事件相关联的事件结构。此事件信息仅属于导致回调函数执行的事件。有关受支持的事件类型及其关联的事件结构的完整列金宝app表,请参见事件结构

除了这两个必需的输入参数外,您还可以为回调函数指定额外的、特定于应用程序的参数。

请注意

要接收对象和事件参数以及任何其他参数,在指定函数名作为回调属性的值时必须使用单元格数组。有关更多信息,请参见指定回调函数

编写回调函数

为了说明这一点,这个例子实现了一个用于帧获取事件的回调函数。这个回调函数使您能够通过定期查看示例帧来监视正在获取的帧。

为了实现这个函数,回调函数获取一帧数据,并在MATLAB中显示所获取的帧®图窗口。该函数还访问作为参数传递的事件结构,以显示所显示帧的时间戳。的drawnow命令在回调函数中强制MATLAB更新显示。

函数display_frame(obj,事件)sample_frame = peekdata(obj,1);显示亮度图像(sample_frame);drawnow;abtime = event. data . abtime;t =修复(abstime);sprintf (' % s % d: % d: % d ',“时间戳”,t (4), (5), t (6))

要了解如何使用这个函数作为回调,请参见查看样本框架

指定回调函数

通过设置事件的回调属性的值,可以将回调函数与特定的事件关联起来。视频输入对象支持所有类型的事件的回调属性。金宝app

你可以通过以下三种方式指定callback函数作为属性的值:

下面几节提供关于这些选项的更多信息。

请注意

要访问传递给回调函数的对象或事件结构,必须将函数指定为单元格数组或函数句柄。

使用字符向量指定回调函数

您可以将回调函数指定为字符向量。例如,这段代码指定了回调函数mycallback作为启动事件回调属性的值StartFcn用于视频输入对象从视频

从视频。StartFcn =“mycallback”;

在这种情况下,回调是在MATLAB工作空间中计算的。

使用单元格数组指定回调函数

您可以将回调函数指定为单元格数组中的字符向量。

例如,这段代码指定了回调函数mycallback作为启动事件回调属性的值StartFcn用于视频输入对象从视频

从视频。StartFcn = {' mycallback '};

要指定附加参数,请将它们作为单元格数组中的附加元素包含。

时间= datestr (0);从视频。StartFcn = {mycallback,时间};

传递给回调函数的前两个参数仍然是视频输入对象(obj)和事件结构(事件).在这两个论点之后还有其他论点。

使用函数句柄指定回调函数

您可以将回调函数指定为函数句柄。

例如,这段代码指定了回调函数mycallback作为启动事件回调属性的值StartFcn用于视频输入对象从视频

从视频。StartFcn = @mycallback;

要指定其他参数,请将函数句柄和参数作为单元格数组中的元素包含。

时间= datestr (0);从视频。StartFcn = {@mycallback,时间};

如果你在MATLAB文件中执行一个本地回调函数,你必须指定回调作为一个函数句柄。

指定工具箱函数为回调函数

除了指定自己创建的回调函数外,还可以指定开始停止,或触发工具箱函数作为回调函数。例如,这段代码将停止事件回调的值设置为Image Acquisition Toolbox™开始函数。

从视频。StopFcn = @start;

禁用回调

如果在执行回调函数时发生错误,工具箱将禁用回调并显示类似如下的消息。

开始(vid) ? ?错误使用==> frames_cb输入参数太多。警告:FramesAcquiredFcn回调被禁用。

若要启用已禁用的回调,请设置与该回调关联的属性的值或重新启动该对象。

查看样本框架

这个例子创建了一个视频输入对象,并将获取的帧事件回调函数属性设置为display_frame中创建的函数,编写回调函数

这个例子设置了TriggerRepeat属性的对象为4,以便获得50帧。在运行时,该示例在每次获得五帧数据时显示采集数据的一个样本帧。

  1. 创建一个图像采集对象-这个例子为矩阵创建一个视频输入对象®图像采集设备。要在您的系统上运行此示例,请使用imaqhwinfo函数获取图像采集设备的对象构造函数,并将该语法替换为以下代码。

    Vid = videoinput(' matrix ', 1);
  2. 配置属性值——这示例设置FramesPerTrigger值为30TriggerRepeat性质4。的值也指定为FramesAcquiredFcn回调事件回调函数display_frame中创建的,编写回调函数.对象将执行FramesAcquiredFcn的值指定每五帧FramesAcquiredFcnCount财产。

    从视频。FramesPerTrigger = 30;从视频。TriggerRepeat = 4;从视频。FramesAcquiredFcnCount = 5;从视频。FramesAcquiredFcn = {' display_frame '};
  3. 获取数据—启动视频输入对象。每次获取五帧时,对象执行display_frame回调函数。这个回调函数显示最近获取的记录到内存缓冲区的帧。

    开始(vid)
  4. 清理-当您不再需要图像采集对象时,总是将其从内存中移除,以及引用它们的变量。

    删除(vid)清晰的视频