提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
做项目过程中需要对Basler相机进行二次开发,所以写一些记录给大家参考。
附上一些在其他地方看到的参考资料:
- Basler 工业相机与Python开发链接: link
- Basler 工业相机 Python开发采集数据、保存照片: link
- pypylon模块调用basler相机采集数据: link
一、相机类 InstantCamera
1. class InstantCamera (InstantCamera Params_Params)
# 提供方便的访问相机设备。
• 为访问相机功能建立一个单一的访问点。这个类可以在没有任何参数的情况下使用。相机使用相机设备的默认配置,可被覆盖。
• 处理Pylon设备的生存期,可被覆盖。
• 自动处理打开和关闭一个Pylon设备。
• 处理块数据解析,自动返回抓取结果中的块数据。
• 自动处理事件抓取,为事件回调提供了一个方便的接口,可被覆盖。
• 处理物理相机设备移除。
• 处理缓冲区的创建、重用和销毁。
• 抓取可以在调用者的上下文中完成,也可以使用额外的抓取循环线程。
• Instant Camera类可以通过派生或注册事件处理程序对象进行扩展。
其中主要的函数:
def Attach(self,*args)->"void":
# 将Pylon设备连接到InstantCamera
参数:
• pDevice-要连接的Pylon设备。
• cleanupProcedure-如果cleanupProcedure等于Cleanup_Delete,则在销毁Instant Camera对象时销毁Pylon设备。
• 如果当前连接了一个Pylon设备,则根据先前设置的清理过程值,将其销毁(DestroyDevice())或移除(DetachDevice())。
• 如果pDevice参数为NULL,则不再执行任何操作。OnAttach配置事件被触发。
• 附加新的Pylon设备。如果传递的Pylon设备是打开的,则相机事件的回调将在相机节点映射上注册。(这可能会失败)
如果传递的Pylon设备是打开的,则注册一个设备移除回调(这可能会失败)。访问修饰符(参见IPylonDevice:: open())将被取代为相机参数。
• OnAttached配置事件被触发。来自事件调用的可能的c++异常被捕获并忽略。通知所有事件处理程序。
Post:
• 如果传递给Pylon设备的指针为NULL,则Instant Camera对象处于“无设备连接”状态。
• 如果指针不是NULL,则连接传递的Pylon设备。
• 如果设置的清除过程等于Cleanup_Delete,则在销毁Instant Camera对象或附加新设备时销毁Pylon设备。
• 如果传递的Pylon设备是打开的,并且回调注册失败,则Instant Camera对象处于“未连接设备”状态。
• 设置了“由用户打开”标志,以防止在附加的Pylon设备已经打开时,在stopgrab()上关闭Pylon设备。
• 如果传递的Pylon设备打开,则可能引发异常。如果传递的Pylon设备关闭或为NULL,则不抛出C+异常。
• 该方法使用GetLock()提供的Lock进行同步。
def IsPylonDeviceAttached(self)->"bool":
# 返回Instant Camera对象的Pylon设备连接状态
def RegisterImageEventHandler(self,pImageEventHandler:"ImageEventHandler",mode: "Pylon::ERegistrationMode",cleanupProcedure:"Pylon::ECleanup")->"void":
# 将图像事件处理程序添加到已注册图像事件处理程序对象的列表。
• 如果mode = RegistrationMode_ReplaceAll,则已注册的图像事件处理程序列表将被清除.
•如果指针 pImageEventHandler 不是NULL,它将被追加到图像事件处理程序列表中.
参数:
• pImageEventHandler 图像事件的接收者。
• mode 指示如何注册新的imageEventHandler。
• cleanupProcedure 如果=Cleanup_Delete,则在不再需要时删除传递的事件处理程序。
• imageEventHandler在图像相关事件时被注册和调用。
• 不抛出c++异常,除非内存分配失败。此方法使用内部图像事件处理程序注册表进行同步锁。
def StartGrabbing(self,*args)->"void":
# 开始抓取最大数量的图像
• 扩展起始抓取(EStrategy, EGrabLoop)的一些图像来抓取。如果已达到传递的图像计数,则自动调用stopgrabs。
• 根据抓取策略对图像进行计数。跳过的图像不会被考虑在内。
• 当抓取的图像少于MaxNumBuffer参数的值时,分配的缓冲区数量减少到maxImages,并且抓取策略为GrabStrategy_OneByOne。
参数:
• maxImages要抓取的图像的计数。该值必须大于零。
• strategy抓取策略。更多信息请参见Pylon::InstantCamera::EStrategy。
• grabLoopType如果grabLoopType等于GrabLoop_ProvidedByInstantCamera,则使用一个额外的抓取循环线程来运行抓取循环。该方法使用GetLock()提供的锁进行同步。
def RetrieveResult(self,*args)->"bool":
# 根据策略检索抓取结果,如果还不可用则等待
• 释放通过抓取结果的内容。
• 如果没有附加Pylon设备或抓取未启动,该方法立即返回“false”。
• 如果还没有,请等待抓取结果。在等待过程中,摄像头的访问不被锁定。相机事件被处理。
• 仅当使用相机事件时:传入的相机事件被处理。
• 根据所应用的策略,每次呼叫检索一个抓取结果。
• 仅当使用chunk模式时:进行chunk数据解析。抓取结果数据使用块数据更新。
• 图像事件OnImagesSkipped被触发,如果抓取结果已经根据策略跳过。当事件调用触发异常时,事件处理程序的通知将停止。
• 如果抓取结果可用,则触发图像事件onimagegrabs。
当事件调用触发异常时,事件处理程序的通知将停止。
• 如果已抓取图像的最大数量,则调用stopgrabs()停止抓取。
需要检查抓取结果所代表的抓取是否成功,参见CGrabResultData::GrabSucceeded()。
参数:
• timeoutMs: 等待抓取结果的超时值(以毫秒为单位)或INFINITE值。
• grabResult: 接收抓取结果。
• timeoutHandling: 如果timeoutHandling = TimeoutHandling_ThrowException,则在超时时抛出超时异常。
返回:
• 如果调用成功检索抓取结果为True,否则为false。
• 没有其他线程在等待结果。这将是使用即时相机抓取循环线程的情况。
Post:
• 如果抓取结果已被检索,则从输出队列中删除一张图像,并在grabResult参数中返回。
• 如果没有抓取结果,在grabResult参数中返回一个空的抓取结果。
• 如果已抓取图像的最大数量,则抓取停止。
• 如果启用了相机事件处理,并且收到了相机事件,则至少一个或多个相机事件消息已被处理。
• 即时相机对象在错误后仍然有效。如果抛出一个异常则抓取结束。
• 该方法在不等待时使用GetLock()提供的锁进行同步。
def GetTLNodeMap(self)->"GENAPI_NAMESPACE::INodeMap&":
# 提供对所附Pylon设备的传输层节点映射的访问
返回:
• 对连接的Pylon设备的传输层节点映射的引用,或者如果不支持传输层节点映射,则对空节点映射的引用。
• GENAPI_NAMESPACE::INodeMap::GetNumNodes()方法可以用来检查节点映射是否为空。
• 前提:已连接相机设备。
• 即时相机对象在错误后仍然有效。该方法使用GetLock()提供的锁进行同步。
2. class DeviceInfo(CInfoBase):
# 保存关于枚举设备的信息
设备枚举过程创建一个CDeviceInfo对象列表(Pylon::DeviceInfoList_t)。每个CDeviceInfo对象存储设备的信息。
在设备枚举过程中检索信息(ITransportLayer::EnumerateDevices resp. CTlFactory:: EnumerateDevices)
def GetUserDefinedName(self)->"Pylon::String_t":
# 检索用户定义的名称(如果存在),此属性由Key::UserDefinedNameKey标识
def GetDeviceFactory(self)->"Pylon::String_t":
# 检索能够创建此设备的传输层的标识符。此属性由Key::DeviceFactoryKey标识
3. class TlFactory(object):
# 传输层工厂,创建、销毁和枚举传输层及其设备
def GetInstance()->"Pylon::CTlFactory&":
# 检索传输层工厂单例
def CreateFirstDevice(self,*args)->"Pylon::IPylonDevice*":
# 从设备信息对象中创建第一个找到的设备,注入额外的GenICam XML定义字符串
def CreateDevice(self,*args)->"Pylon::IPylonDevice*":
二、图像事件处理类 ImageEventHandler
4. class ImageEventHandler(object):
# 图像事件处理程序基类
def OnImagesSkipped(self, camera:"InstantCamera", countOfSkippedImages:"size_t")->"void":
# 当使用GrabStrategy_LatestImageOnly策略或GrabStrategy_LatestImages策略跳过图像时,将调用此方法
参数:
• camera: 调用的源。
• countOfSkippedImages: 跳过的图像数量。不包括在驱动程序中运行缓冲区时丢失的图像数量。
• 来自此调用的异常将继续传播。事件处理程序的通知在异常触发时停止。
• 此方法在相机对象的锁之外调用,但在图像事件处理程序注册表的锁内部调用。
def OnImageGrabbed(self, camera:"InstantCamera", grabResult:"GrabResult")->"void":
# 在抓取图像时调用此方法
传递的抓取结果智能指针总是引用抓取结果数据对象。在访问抓取结果数据之前,需要检查抓取状态。更多信息请参见CGrabResultData::GrabSucceeded(), CGrabResultData::GetErrorCode()和CGrabResultData::GetErrorDescription()。
参数:
• camera :调用的源。
• grabResult :抓取结果数据。
• 来自此调用的异常将继续传播。事件处理程序的通知在异常触发时停止。
• 此方法在相机对象的锁之外调用,但在图像事件处理程序注册表的锁内部调用。
def OnImageEventHandlerRegistered(self,camera:"InstantCamera")->"void":
# 当注册了图像事件处理程序时,将调用此方法
def DestroyImageEventHandler(self)->"void":
# 销毁图像事件处理程序。
5. class GrabResult(object):
# 一个智能指针,它持有一个获取结果数据的引用
该类用于分配摄像机的抓取结果数据。它控制引用缓冲区的重用和生命周期。
当所有引用缓冲区的智能指针超出作用域时,被引用的缓冲区被重用或摧毁。数据和持有的缓冲区在它产生的相机对象被销毁后仍然有效。
注意: 当抓取结果从未被释放时,例如当放入容器时,抓取将在输入队列欠压时停止。
CGrabResultPtr类提供了一个强制转换操作符,允许将抓取结果直接传递给以const Image&作为参数的函数或方法。
例如,图像保存功能或图像格式转换方法。
注意: 返回的IImage引用只有在它来自的CGrabResultPtr对象没有被销毁的情况下才有效。
引用相同抓取结果的CGrabResultPtr实例可以在任何线程上下文中使用。
6. class PylonImage(PylonImageBase):
# 描述图像
• 自动处理图像缓冲区的大小和生命周期。
• 允许接管抓取结果的缓冲区,这是防止其重用,只要需要。
• 允许连接用户缓冲区或第三方软件包提供的缓冲区。
• 提供加载和保存不同文件格式的图像的方法。
• 作为图像格式转换器’ CImageFormatConverter '的主要目标格式。
• 简化平面图像的工作。
• 简化aoi的提取,例如缺陷的缩略图。
• 缓冲区处理:
如果需要,由CPylonImage类自动创建的缓冲区或托管的抓取结果缓冲区将被更大的缓冲区替换。分配的缓冲区的大小永远不会减少。引用的用户缓冲区永远不会被更大的缓冲区自动替换。引用的抓取结果缓冲区永远不会被重用。有关详细信息,请参阅Reset()方法。Release()方法可用于分离用户缓冲区、释放托管的抓取结果缓冲区或释放已分配的缓冲区。
7. class PylonImageBase(IReusableImage):
将图像保存到磁盘。将图像转换为需要保存的格式。
这是一个调用CImagePersistence::Save()的方便方法。如果需要,图像将自动转换为新图像并保存。更多信息参见CImagePersistence:: CanSaveWithoutConversion()。如果图像文件格式支持,位深度大于8位的图像将以16位位深度存储。在这种情况下,像素数据是MSB对齐的。如果需要对转换进行更多的控制,可以使用CImageFormatConverter类在保存输入图像之前对其进行转换。
参数:
imageFileFormat: 保存图像的文件格式
filename: 图像的名称和路径
pOption 额外的选项
pre:
要保存的图像像素类型必须是Pylon::CImageFormatConverter支持的输入格式。如果保存图像失败,则抛出异常。文章来源:https://www.toymoban.com/news/detail-557689.html
总结
后续会更新对basler相机控制的具体代码。文章来源地址https://www.toymoban.com/news/detail-557689.html
到了这里,关于Basler工业相机python开发(Pypylon)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!