.. figure:: https://user-images.githubusercontent.com/8652625/40595190-1e16e90e-626e-11e8-9dc7-207d691c6d6d.jpg :align: center :alt: 收割者
老彼得·勃鲁盖尔,《收割者》,1565年,(c) 大都会艺术博物馆
.. image:: https://readthedocs.org/projects/harvesters/badge/?version=latest :target: https://harvesters.readthedocs.io/en/latest/?badge=latest
.. image:: https://img.shields.io/pypi/v/harvesters.svg :target: https://pypi.org/project/harvesters
.. image:: https://zenodo.org/badge/133908095.svg :target: https://zenodo.org/badge/latestdoi/133908095
.. contents:: 目录 :depth: 1
关于Harvester
Harvester是一个Python库,旨在让您的计算机视觉应用中的图像采集过程变得极其简单。就像上图中的农民/收割者一样,它收集图像数据作为收获,并填满您的桶/缓冲区。
您可以在Apache License-2.0下自由使用、修改、分发Harvester,而无需担心您的软件用途:个人、内部或商业。
Harvester为您完成的任务
Harvester的主要功能包括:
- 通过GenTL生产者进行图像采集
- 在单个Python脚本中多重加载GenTL生产者
- GenICam特性节点操作
请注意,第二项意味着您可以在Python脚本中涉及各种类型的传输层。每种传输层都有自己的优缺点,您应该根据应用程序的要求选择适当的传输层。您只需要出于某些目的获取图像,GenTL生产者以某种方式传递图像。这确实是GenTL标准的巨大优势!当然,不仅是GenTL生产者,Harvester还为您提供了一种直观的方式在单个Python脚本中操作多个GenICam兼容实体(如相机)。
需要GUI吗?
您需要GUI吗?Harvester有一个姐妹项目,名为Harvester GUI。如果您对此感兴趣,请访问:
https://github.com/genicam/harvesters_gui
.. image:: https://user-images.githubusercontent.com/8652625/43035346-c84fe404-8d28-11e8-815f-2df66cbbc6d0.png :align: center :alt: 图像数据可视化器
提问
我们准备了一个FAQ页面。也许您的问题可以通过阅读它来解决:
https://github.com/genicam/harvesters/wiki/FAQ
如果没有提到您遇到的问题,请尝试访问以下页面,检查是否有相关的问题工单。如果还没有提到,请随时创建一个问题工单,以便我们能够帮助您:
https://github.com/genicam/harvesters/issues
链接
.. list-table::
- - 文档
- https://harvesters.readthedocs.io/en/latest/
- - 数字对象标识符
- https://zenodo.org/record/3554804#.Xd4HSi2B01I
- - EMVA网站
- https://www.emva.org/standards-technology/genicam/genicam-downloads/
- - Harvester GUI
- https://github.com/genicam/harvesters_gui
- - 问题追踪器
- https://github.com/genicam/harvesters/issues
- - PyPI
- https://pypi.org/project/harvesters/
- - 源代码仓库
- https://github.com/genicam/harvesters
Harvester在IPython上运行
以下代码块显示了Harvester在IPython上运行。获取的图像作为缓冲区的有效载荷传递,可以通过调用ImageAcquirer
类的fetch
方法获取缓冲区。一旦获取图像,您应该能够立即开始图像处理。如果您在Jupyter notebook上运行,您应该能够使用Matplotlib可视化图像数据。这一步应该有助于检查您在图像处理流程中的尝试情况。
.. code-block:: python
(genicam) kznr@Kazunaris-MacBook:~% ipython
Python 3.6.6 |Anaconda, Inc.| (default, Jun 28 2018, 11:07:29)
Type 'copyright', 'credits' or 'license' for more information
IPython 6.5.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: from harvesters.core import Harvester
In [2]: import numpy as np # 这只是为了演示。
In [3]: h = Harvester()
In [4]: h.add_file('/Users/kznr/dev/genicam/bin/Maci64_x64/TLSimu.cti')
In [5]: h.update()
In [6]: len(h.device_info_list)
Out[6]: 4
In [7]: h.device_info_list[0]
Out[7]: {'display_name': 'TLSimuMono (SN_InterfaceA_0)', 'id_': 'TLSimuMono', 'model': 'TLSimuMono', 'serial_number': 'SN_InterfaceA_0', 'tl_type': 'Custom', 'user_defined_name': 'Center', 'vendor': 'EMVA_D', 'version': '1.2.3'}
In [8]: ia = h.create(0)
In [9]: ia.remote_device.node_map.Width.value = 8
In [10]: ia.remote_device.node_map.Height.value = 8
In [11]: ia.remote_device.node_map.PixelFormat.value = 'Mono8'
In [12]: ia.start()
在[13]中:使用ia.fetch()作为缓冲区: # 让我们创建2D图像组件的别名: component = buffer.payload.components[0]
# 请注意,组件的数量可能会有所不同。如果你的
# 目标远程设备传输多部分信息,那么
# 你会在有效负载中获得两个或更多组件。但是,现在
# 我们正在使用只传输2D图像的远程设备。
# 所以我们只操作列表对象components的索引0。
# 让我们看看获取的1D数据:
_1d = component.data
print('1D: {0}'.format(_1d))
# 将NumPy数组重塑为2D数组:
_2d = component.data.reshape(
component.height, component.width
)
print('2D: {0}'.format(_2d))
# 这里是一些简单的计算:
print(
'AVE: {0}, MIN: {1}, MAX: {2}'.format(
np.average(_2d), _2d.min(), _2d.max()
)
)
1D: [123 124 125 126 127 128 129 130 124 125 126 127 128 129 130 131 125 126 127 128 129 130 131 132 126 127 128 129 130 131 132 133 127 128 129 130 131 132 133 134 128 129 130 131 132 133 134 135 129 130 131 132 133 134 135 136 130 131 132 133 134 135 136 137] 2D: [[123 124 125 126 127 128 129 130] [124 125 126 127 128 129 130 131] [125 126 127 128 129 130 131 132] [126 127 128 129 130 131 132 133] [127 128 129 130 131 132 133 134] [128 129 130 131 132 133 134 135] [129 130 131 132 133 134 135 136] [130 131 132 133 134 135 136 137]] AVE: 130.0, MIN: 123, MAX: 137
在[14]中:ia.stop()
在[15]中:ia.destroy()
在[16]中:h.reset()
在[17]中:quit (genicam) kznr@Kazunaris-MacBook:~%
术语
在开始详细讨论之前,让我们看一下本文档中经常出现的一些重要术语。这些术语列举如下:
-
GenApi-Python绑定:一个与GenICam GenApi参考实现通信的Python模块。
-
GenTL生产者:一个具有C接口的库,为消费者提供了一种通过物理传输层相关技术与相机通信的方式,对消费者隐藏了细节。
-
GenTL-Python绑定:一个与GenTL生产者通信的Python模块。
-
Harvester:一个图像采集引擎。
-
Harvester GUI:一个基于Harvester的图形用户界面。
-
GenICam兼容设备:通常是一个相机。只需涉及GenICam参考实现,它就为消费者提供了一种动态配置/控制目标远程设备的方式。
以下图表显示了相关模块的层次结构和关系:
[图表位置]
Harvester入门
你准备好开始使用Harvester了吗?你可以在这些页面上了解更多主题:
INSTALL.rst <docs/INSTALL.rst>
_:了解如何安装Harvester及其先决条件。TUTORIAL.rst <docs/TUTORIAL.rst>
_:了解如何在典型的图像采集工作流程中使用Harvester。
开源资源
Harvester使用以下开源库/资源:
-
Pympler
| 许可证:
Apache许可证,版本2.0 <https://www.apache.org/licenses/LICENSE-2.0.html>
_ | 版权所有 (c) Jean Brouwers, Ludwig Haehne, Robert Schuppenies| https://pythonhosted.org/Pympler/ | https://github.com/pympler/pympler | https://pypi.org/project/Pympler/
-
Versioneer
| 许可证:
知识共享"公共领域贡献"许可证 (CC0-1.0) <https://creativecommons.org/publicdomain/zero/1.0/>
_ | 版权所有 (c) 2018 Brian Warner
致谢
以下个人直接或间接地为Harvester的开发活动做出了贡献;他们真的是出色的GenICam同事: Rod Barman、Stefan Battmer、David Beek、Jan Becvar、David Bernecker、Chris Beynon、Eric Bourbonnais、Benedikt Busch、George Chamberlain、Thomas Detjen、Friedrich Dierks、Dana Diezemann、Emile Dodin、Reynold Dodson、Sascha Dorenbeck、Jozsa Elod、Erik Eloff、Katie Ensign、Andreas Ertl、James Falconer、Werner Feith、Maciej Gara、Andreas Gau、Sebastien Gendreau、Francois Gobeil、Werner Goeman、Jean-Paul Goglio、Markus Grebing、Eric Gross、Ioannis Hadjicharalambous、Uwe Hagmaier、Tim Handschack、Christopher Hartmann、Reinhard Heister、Gerhard Helfrich、Jochem Herrmann、Heiko Hirschmueller、Tom Hopfner、David Hoese、Karsten Ingeman Christensen、Severi Jaaskelainen、Alfred Johannesson、Mattias Johannesson、Mark Jones、Mattias Josefsson、Martin Kersting、Stephan Kieneke、Tom Kirchner、Lutz Koschorreck、Frank Krehl、Maarten Kuijk、Max Larin、Ralf Lay、Min Liu、Sergey Loginonvskikh、Thomas Lueck、Alain Marchand、Rocco Matano、Masahide Matsubara、Stephane Maurice、Robert McCurrach、Mike Miethig、Thies Moeller、Roman Moie、Katsura Muramatsu、Silvan Murer、Marcel Naggatz、Hartmut Nebelung、Damian Nesbitt、Quang Nhan Nguyen、Klaus-Henning Noffz、Jonas Olofsson、Neerav Patel、Jan Pech、Merlin Plock、Joerg Preckwinkel、Benjamin Pussacq、Dave Reaves、Thomas Reuter、Gordon Rice、Andreas Rittinger、Ryan Robe、Nicolas P. Rougier、Felix Ruess、Matthias Schaffland、Michael Schmidt、Jan Scholze、Martin Schwarzbauer、Rupert Stelz、Madhura Suresh、Chendra Hadi Suryanto、Andrew Wei Chuen Tan、Timo Teifel、Albert Theuwissen、Laval Tremblay、Tim Vlaar、Silvio Voitzsch、Stefan Von Weihe、Frederik Voncken、Roman Wagner、Ansger Waschki、Anne Wendel、Michael Williamson、Jean-Michel Wintgens、Manfred Wuetschner、Jang Xu、Christoph Zierl、Sebastian Yap和Juraj Zopp