提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、相机类 InstantCamera
  • 二、图像事件处理类 ImageEventHandler
  • 总结

前言

做项目过程中需要对Basler相机进行二次开发,所以写一些记录给大家参考。
附上一些在其他地方看到的参考资料:

  1. Basler 工业相机与Python开发链接: link
  2. Basler 工业相机 Python开发采集数据、保存照片: link
  3. 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支持的输入格式。如果保存图像失败,则抛出异常。

总结

后续会更新对basler相机控制的具体代码。

Basler工业相机python开发(Pypylon)相关推荐

  1. Basler 工业相机 Python开发采集数据、保存照片

    Python 安装pypylon 建议先下载pypylon轮子文件(下载地址),下载后Pip install 轮子文件, 安装即可. 注意不要用Python 3.8, pypylon 只能支持到Pyt ...

  2. 基于MFC的Basler工业相机SDK开发

    一.软.硬件准备 VS2017 opencv3.4.6 相机:Basler acA2500-14gm 驱动:pylon 二.软硬件配置 下载安装pylon,到basler官方网站下载适合自己相机的py ...

  3. 迈德威视工业相机python二次开发,修改相机参数

    迈德威视工业相机python二次开发,修改相机参数 1. 调用官方给的参考例程grab.py 例程下载地址:https://www.mindvision.com.cn/rjxz/list_12.asp ...

  4. python安装包_迈出Python学习第一步:Python开发环境的下载与安装

    所谓"磨刀不误砍柴工"."工欲善其事,必先利其器",都在告诉我们一个道理:要做好一个事情,事先做好充分的准备工作是非常重要的.所以在我们正式学习用Python编 ...

  5. python 开发板-MicroPython:STM32 上 的 Python 开发

    虽然Python在国外是一门非常火的语言,在黑客界更是赫赫有名,然而中国的大学却极少开设 Python 课程,故而国内 Python 程序员多属自学.而一个没有MCU编程经验的初学者,要想让芯片跑起来 ...

  6. 如何在python开发的GUI界面程序中恰当地使用PyExecJS

    点击上方↑↑↑蓝字[协议分析与还原]关注我们 "解决一闪而过的黑框的小技巧." 在使用python开发过程中,不可避免地,会开发带界面的应用,也会经常使用js来完成一些功能,比如, ...

  7. Python培训教程分享:10款超好用的Python开发工具

    学会Python技术后,我们在参加工作的时候如果能有辅助工具的话,那么会很大程度的提高我们的工作效率,那么Python都有哪些好用的开发工具呢?下面小编就为大家详细的介绍一下10款超好用的Python ...

  8. 学习Python开发培训有用吗

    学习Python开发培训有用吗?这是目前很多人都比较关注的一个问题,Python语言在最近几年是广受IT互联网行业关注的, 下面我们就针对这问题来详细的分析一下. 学习Python开发培训有用吗?Py ...

  9. Python开发【第十篇】:CSS (二)

    Python开发[前端]:CSS Kylin Zhang 发表于 2016-11-10 13:13:57 css样式选择器 标签上设置style属性: <body><div styl ...

最新文章

  1. java 启动参数_网红框架SpringBoot2.x之定制参数浅析(一)
  2. qt 拖拽 修改大小(二)
  3. MySQL学习笔记02【SQL基本概念与通用语法、数据库的CRUD操作】
  4. 51nod 1102 面积最大的矩形 新疆大学OJ 1387: B.HUAWEI's billboard 【单调栈】+【拼凑段】(o(n) 或 o(nlog(n))
  5. 控制台打印列未定义错误
  6. 【scala初学】scala 控制 for while match if
  7. git 合并冲突_GIT提交记录和Revert commit过程分析
  8. mock模拟接口测试 vue_Easy Mock以及Vue+Mock.js模拟数据
  9. queryselectorall 怎么取name_用这个方法,我爬取了《王者荣耀》《英雄联盟》等游戏皮肤图片...
  10. 小蒜的A+B 计蒜客 - T1283
  11. bootstrap中的模态框(modal,弹出层)
  12. 解析Disruptor:写入ring buffer
  13. 综述文章笔记——《A Survey on Traffic Signal Control Methods》等
  14. pytorch安装GPU版本 (Cuda12.1)教程
  15. HTML动画XYZ轴的用法详解
  16. 用python画一只可爱的皮卡丘
  17. 低配本用win10服务器系统,低配电脑用win7还是win10比较好_低配置电脑装win7还是win10系统合适...
  18. java中什么是空指针异常以及为什么会产生空指针异常
  19. 学习笔记--EMI是什么?
  20. 常见PHP实现URL地址跳转代码

热门文章

  1. 【Java】AWT和Swing概述
  2. 公司上市有几种方式?
  3. 计算机软件基础-数据结构与算法
  4. 【Pytorch】data.norm(几种范数(norm)的详细介绍)
  5. ECharts关于y轴刻度调整
  6. 华为服务器 26块硬盘,产品推广—华为服务器推荐
  7. 1992-2022年31省人均gdp/各省人均地区生产总值
  8. Linux:删除重复文件工具fdupes
  9. 紫薇圣人的程序员人生[原创IT小说]
  10. 如何学好编程?学习经验汇总