Getting started#
Installation#
From PyPI:
pip install pyGigEVision
From source:
git clone https://github.com/ladisk/pyGigEVision.git
cd pyGigEVision
pip install -e .
Requirements#
Python 3.10 or newer
NumPy 1.20 or newer
psutil(used to enumerate host network interfaces for multi-interface discovery)A network interface that can reach the camera (usually a link-local
169.254.x.xaddress on a dedicated Ethernet adapter, or a routed192.168.x.xsubnet)Windows Firewall (or equivalent) allowing inbound UDP for the Python process
First contact#
Discover any GigE Vision cameras on the network:
from pyGigEVision import discover
cameras = discover(timeout=2.0)
for cam in cameras:
print(f"{cam['manufacturer']:30s} {cam['model']:30s} {cam['ip']}")
Called with no interface argument, discover() sweeps every host
network interface, so cameras on secondary NICs and USB-to-GigE adapters
are found by default. Each result dict includes ip, mac, and
interface_ip (the host interface the camera replied on), which lets a
caller bind the correct local interface when connecting.
If a camera comes up on a subnet none of your host interfaces can reach,
use force_ip(mac, ip, mask) to re-home it to a reachable address:
from pyGigEVision import GVCPClient
# force_ip is a static method; it broadcasts and needs no connection.
GVCPClient.force_ip(cam["mac"], "169.254.10.50", "255.255.0.0")
If no cameras appear, see the Protocol overview page for troubleshooting network setup and packet capture.
Connecting and grabbing one frame#
The pyGigEVision.bootstrap() helper performs the standard boot
sequence: open a control session, acquire control privilege, start the
heartbeat thread, and fetch the GenICam XML descriptor.
from pyGigEVision import bootstrap, GVSPReceiver
client, xml = bootstrap("169.254.1.10")
print(f"Downloaded {len(xml)} bytes of GenICam XML")
# From here you configure your camera's vendor-specific registers
# (Width, Height, PixelFormat, AcquisitionStart, ...) using
# client.write_reg(), then receive frames via GVSPReceiver.
client.disconnect()
For a complete end-to-end example, see Examples.
What pyGigEVision is and is not#
pyGigEVision implements the protocol layer defined by the GigE
Vision specification. It does not know which register addresses your
camera uses for Width or ExposureTime; those are
vendor-specific and discovered from the camera’s GenICam XML.
For a turn-key driver for a specific camera, you would either:
Use a vendor-specific package built on top of
pyGigEVision.Write your own thin vendor layer that parses the GenICam XML and wraps the relevant registers. See the Examples page for a starting point.