Pylon API中事件通知机制允许开发者注册事件处理器来监听相机的特定事件,但Pylon不是开源的,因此本文尝试实现此机制
+Here’s something encrypted, password is required to continue reading.
From 64d47ec74cf102b7116845904ccd76e0e69083e4 Mon Sep 17 00:00:00 2001 From: paw5zx <1694470114@qq.com> Date: Mon, 18 Nov 2024 17:50:53 +0800 Subject: [PATCH] Site updated: 2024-11-18 17:50:52 --- 404.html | 2 +- Centos8-install/index.html | 2 +- GObject-tutorial-beginner-01/index.html | 2 +- GObject-tutorial-beginner-02/index.html | 2 +- IO-Multiplexing-do-select/index.html | 2 +- IO-Multiplexing-select/index.html | 2 +- UE-fmodel-blackmyth-wukong/index.html | 2 +- UE-fmodel-usage/index.html | 2 +- aravis-GVCP-packets/index.html | 2 +- aravis-camera-api/index.html | 2 +- aravis-camera-features/index.html | 2 +- aravis-chunk-parser/index.html | 2 +- aravis-install/index.html | 2 +- .../index.html | 2 +- .../index.html | 2 +- aravis-multiple-acquisition-signal/index.html | 2 +- aravis-pixelformat/index.html | 2 +- aravis-single-acquisition/index.html | 2 +- archives/2023/10/index.html | 2 +- archives/2023/index.html | 2 +- archives/2024/03/index.html | 2 +- archives/2024/04/index.html | 2 +- archives/2024/05/index.html | 2 +- archives/2024/06/index.html | 2 +- archives/2024/07/index.html | 2 +- archives/2024/08/index.html | 2 +- archives/2024/10/index.html | 2 +- archives/2024/11/index.html | 2 +- archives/2024/index.html | 2 +- archives/2024/page/2/index.html | 2 +- archives/2024/page/3/index.html | 2 +- archives/2024/page/4/index.html | 2 +- archives/index.html | 2 +- archives/page/2/index.html | 2 +- archives/page/3/index.html | 2 +- archives/page/4/index.html | 2 +- categories/C/index.html | 2 +- .../GObject/index.html" | 2 +- .../index.html" | 2 +- .../index.html" | 2 +- .../Linux\346\223\215\344\275\234/index.html" | 2 +- categories/Linux/index.html | 2 +- .../index.html" | 2 +- .../index.html" | 2 +- .../C-\350\257\255\346\263\225/index.html" | 2 +- categories/c-plus-plus/Tools/index.html | 2 +- categories/c-plus-plus/index.html | 2 +- categories/c-plus-plus/page/2/index.html | 2 +- .../index.html" | 2 +- .../index.html" | 2 +- categories/git/index.html | 2 +- categories/index.html | 2 +- .../Aravis/index.html" | 2 +- .../Basler/index.html" | 2 +- .../index.html" | 2 +- .../page/2/index.html" | 2 +- .../UE/index.html" | 2 +- .../index.html" | 2 +- .../index.html | 2 +- .../index.html | 2 +- .../index.html | 2 +- .../index.html | 2 +- cpp-shared-lib-search-priority/index.html | 2 +- cpp-shared-lib-soname/index.html | 2 +- .../index.html | 2 +- design-pattern-2-abstract-factory/index.html | 2 +- .../index.html | 2 +- design-pattern-2-factory-method/index.html | 2 +- design-pattern-2-simple-factory/index.html | 2 +- git-code-migration/index.html | 2 +- index.html | 4 +- links/index.html | 2 +- .../index.html | 2 +- linux-update-alternatives/index.html | 2 +- network-bridging/index.html | 2 +- page/2/index.html | 2 +- page/3/index.html | 2 +- page/4/index.html | 2 +- pylon-camera-events-handling/index.html | 110 +++++------------- reference-counting/index.html | 2 +- search.xml | 90 +++----------- singleton-destruct/index.html | 2 +- singleton-reorder/index.html | 2 +- singleton/index.html | 2 +- tags/index.html | 2 +- thirdlib-jsoncpp/index.html | 2 +- thirdlib-log4cpp/index.html | 2 +- tools-pahole/index.html | 2 +- 88 files changed, 131 insertions(+), 243 deletions(-) diff --git a/404.html b/404.html index 181d9c6..28b83a9 100644 --- a/404.html +++ b/404.html @@ -537,7 +537,7 @@
Pylon API中事件通知机制允许开发者注册事件处理器来监听相机的特定事件,但Pylon不是开源的,因此本文尝试实现此机制
+Here’s something encrypted, password is required to continue reading.
最近在做自己的相机管理框架的时候,又回想起了Pylon(Basler的相机控制软件)API中的各种事件处理机制,感觉非常有用。但由于Pylon的代码不是开源的,只能尝试自己实现。
-在本文中先简单介绍Pylon API中提供的的配置事件处理程序(即Pylon::CConfigurationEventHandler
)及其调用机制,然后尝试自己实现。
只是尽可能地尝试复现其内部调用机制,很多细节在本文中不会给出。
- + +首先先简单介绍一下Pylon::CConfigurationEventHandler
,它是一个用于相机配置的事件处理类,允许用户在相机的生命周期的关键点上自定义配置。例如:
OnOpened
方法,将会在相机成功打开后被调用,用户可以重写此方法以实现自定义操作;OnGrabStopped
方法,将会在抓取行为停止完成后被调用,用户可以重写此方法以实现自定义操作;在Pylon示例中展示了它的使用方法:
-①首先在头文件创建一个自定义的配置事件处理类,它继承自ConfigurationEventHandler
,并在这个类中重写有需要的回调函数。在示例中,将每个回调函数的内容定义为打印相应事件的名称,方便观察。
1 | //file: ConfigurationEventPrinter.h |
②使用时通过RegisterConfiguration 在相机对象中注册。注册完成后,当遇到相机行为的关键节点,重写的相应的回调函数会被调用。
-1 |
|
先分析一下要实现像Pylon::CConfigurationEventHandler
这样的事件处理程序,都需要设计哪些组件或步骤。
我打算基于事件驱动架构实现这个机制,因此需要设计实现:
-ConfigurationEventHandler
基类中,后续理清思路再优化)ConfigurationEventHandler
的子类中的回调函数。事件源是相机对象,因此先创建一个抽象相机实例类CameraDevice
,所有不同品牌的具体相机实例类继承自此类。先不急看源文件,头文件部分内容如下:
1 | //file: CameraDevice.h |
一个特定的行为,由于事件不携带其他数据,我这里简单使用一个枚举类:
-1 | //file: MiscStruct.h |
用于事件的传递和分发。在示例中没有使用像消息队列或发布/订阅系统这样的高级事件通道结构,而是通过简单的vector来管理和调用事件处理器,变相实现了事件的传递和分发的功能。由于注册行为和注销行为不频繁,且遍历操作为主导,这里选用vector。
-1 | //file: CameraDevice.h |
从事件通道中获取事件并执行相应的操作,示例中使用一个函数NotifyEventHandeler
完成。
1 | //file: CameraDevice.h |
1 | //file: CameraDevice.c |
接收事件并进行处理。在示例中,是ConfigurationEventHandler
的子类中的回调函数。
我们先看一下ConfigurationEventHandler
的定义:
1 | //file: ConfigurationEventHandler.h |
里面的回调函数定义为空实现,即使用户注册了此类,也不会有什么操作。
-然后我们创建一个子类ConfigurationEventPrinter
,其中每个重写的回调函数的内容定义为打印相应事件的名称,方便观察。
1 | //file: ConfigurationEventPrinter.h |
注册过程,按照pylon的设计思路,也定义为相机对象中的一个成员函数RegisterConfiguration
,因此相机实例类的头文件如下:
1 | //file: CameraDevice.h |
源文件如下:
-1 | //file: CameraDevice.c |
注销过程与注册过程相反,本文不做展示。
-除了上述展示的组件以外,还需将NotifyEventHandeler
在特定的位置调用,以达到在特定节点触发特性事件的效果。接下来直接展示全部的代码:
1 | //file: CameraDevice.h |
这里添加了对NotifyEventHandeler
的调用
1 | //file: CameraDevice.c |
1 | //file: ConfigurationEventHandler.h |
1 | //file: ConfigurationEventPrinter.h |
1 | //file: MiscStruct.h |
在实际使用的过程中,我们需要将ConfigurationEventPrinter
更换为自定义的事件处理器类即可,里面的回调函数依照实际需求进行重写。(上述示例中的回调相关的条目,碍于篇幅,没有展示完全,用户使用时需自己补充,具体条目见Pylon::CConfigurationEventHandler )
现在我演示一下通过事件通知机制实现相机的断线重连功能:
-补充上述示例,增加CameraDeviceRemoved相关条目(具体代码略)
-定义:
-1 | //file: CameraDevice.h |
1 | //file: CameraDevice.c |
定义一个新的事件处理器类ReconnectHandler
,其中重写OnCameraDeviceRemoved
和OnOpened
。
直接在相机对象头文件中定义:
-1 | //file: CameraDevice.h |
最近在做自己的相机管理框架的时候,又回想起了Pylon(Basler的相机控制软件)API中的各种事件处理机制,感觉非常有用。但由于Pylon的代码不是开源的,只能尝试自己实现。
-在本文中先简单介绍Pylon API中提供的的配置事件处理程序(即Pylon::CConfigurationEventHandler
)及其调用机制,然后尝试自己实现。
只是尽可能地尝试复现其内部调用机制,很多细节在本文中不会给出。
- +首先先简单介绍一下Pylon::CConfigurationEventHandler
,它是一个用于相机配置的事件处理类,允许用户在相机的生命周期的关键点上自定义配置。例如:
OnOpened
方法,将会在相机成功打开后被调用,用户可以重写此方法以实现自定义操作;OnGrabStopped
方法,将会在抓取行为停止完成后被调用,用户可以重写此方法以实现自定义操作;在Pylon示例中展示了它的使用方法:
-①首先在头文件创建一个自定义的配置事件处理类,它继承自ConfigurationEventHandler
,并在这个类中重写有需要的回调函数。在示例中,将每个回调函数的内容定义为打印相应事件的名称,方便观察。
//file: ConfigurationEventPrinter.h |
②使用时通过RegisterConfiguration 在相机对象中注册。注册完成后,当遇到相机行为的关键节点,重写的相应的回调函数会被调用。
-
|
先分析一下要实现像Pylon::CConfigurationEventHandler
这样的事件处理程序,都需要设计哪些组件或步骤。
我打算基于事件驱动架构实现这个机制,因此需要设计实现:
-ConfigurationEventHandler
基类中,后续理清思路再优化)ConfigurationEventHandler
的子类中的回调函数。事件源是相机对象,因此先创建一个抽象相机实例类CameraDevice
,所有不同品牌的具体相机实例类继承自此类。先不急看源文件,头文件部分内容如下:
//file: CameraDevice.h |
一个特定的行为,由于事件不携带其他数据,我这里简单使用一个枚举类:
-//file: MiscStruct.h |
用于事件的传递和分发。在示例中没有使用像消息队列或发布/订阅系统这样的高级事件通道结构,而是通过简单的vector来管理和调用事件处理器,变相实现了事件的传递和分发的功能。由于注册行为和注销行为不频繁,且遍历操作为主导,这里选用vector。
-//file: CameraDevice.h |
从事件通道中获取事件并执行相应的操作,示例中使用一个函数NotifyEventHandeler
完成。
//file: CameraDevice.h |
//file: CameraDevice.c |
接收事件并进行处理。在示例中,是ConfigurationEventHandler
的子类中的回调函数。
我们先看一下ConfigurationEventHandler
的定义:
//file: ConfigurationEventHandler.h |
里面的回调函数定义为空实现,即使用户注册了此类,也不会有什么操作。
-然后我们创建一个子类ConfigurationEventPrinter
,其中每个重写的回调函数的内容定义为打印相应事件的名称,方便观察。
//file: ConfigurationEventPrinter.h |
注册过程,按照pylon的设计思路,也定义为相机对象中的一个成员函数RegisterConfiguration
,因此相机实例类的头文件如下:
//file: CameraDevice.h |
源文件如下:
-//file: CameraDevice.c |
注销过程与注册过程相反,本文不做展示。
-除了上述展示的组件以外,还需将NotifyEventHandeler
在特定的位置调用,以达到在特定节点触发特性事件的效果。接下来直接展示全部的代码:
//file: CameraDevice.h |
这里添加了对NotifyEventHandeler
的调用
//file: CameraDevice.c |
//file: ConfigurationEventHandler.h |
//file: ConfigurationEventPrinter.h |
//file: MiscStruct.h |
在实际使用的过程中,我们需要将ConfigurationEventPrinter
更换为自定义的事件处理器类即可,里面的回调函数依照实际需求进行重写。(上述示例中的回调相关的条目,碍于篇幅,没有展示完全,用户使用时需自己补充,具体条目见Pylon::CConfigurationEventHandler )
现在我演示一下通过事件通知机制实现相机的断线重连功能:
-补充上述示例,增加CameraDeviceRemoved相关条目(具体代码略)
-定义:
-//file: CameraDevice.h |
//file: CameraDevice.c |
定义一个新的事件处理器类ReconnectHandler
,其中重写OnCameraDeviceRemoved
和OnOpened
。
直接在相机对象头文件中定义:
-//file: CameraDevice.h |