System designExplainer

Browse and set any GenICam feature with a generic feature tree

How a generic GenICam feature browser walks the camera XML feature tree to browse, read and write every feature by category, with SFNC names.

LumaSpec Vision9 min read Share on LinkedIn

On this page 10 sections
  1. 01The tree is the camera's XML, not the viewer
  2. 02Node types your browser must handle
  3. 03SFNC names make the browser portable
  4. 04Walk the tree in four steps
  5. 05Worked example: stream budget for a 4000 × 3000 USB3 camera
  6. 06Where a generic browser wins, and where the viewer stays
  7. 07Four errors you will hit first
  8. 08Checks before you trust the tool
  9. 09The decision: build it once, run it everywhere
  10. 10Questions

Vendor viewers show a tidy tree of the features their interface designers chose to expose. The first time you need a node that tree hides — a test pattern, a register-level setting, a feature your script must set at run time — the hunt through tabs starts. It does not have to. Every GigE Vision and USB3 Vision camera publishes its own GenICam XML on connect, and that file is the feature tree. Load it, walk the category nodes, and one short piece of browser code enumerates, reads and writes any feature on any compliant camera. You leave with the node types to handle, the SFNC names that keep a browser portable, and a worked example that turns four tree values into a stream budget you can check on paper before the camera is mounted.

The tree is the camera's XML, not the viewer

A GenICam camera serves a device description file over its transport — GigE Vision or USB3 Vision. Your SDK parses that XML into a node map: every feature becomes a node with a name, an interface type, a value, a range, a unit, an access mode and a visibility level. Category nodes (the ICategory interface) hold other nodes as children, and the standard root categories are stable names: DeviceControl, ImageFormatControl, AcquisitionControl, UserSetControl and TransportLayerControl. What a viewer draws as a tree view is one rendering of that map.

Visibility splits into Beginner, Expert, Guru and Invisible. A viewer left at Beginner shows a short tree, which is why Expert nodes feel hidden — they are in the file, one toggle away. A generic browser reads the flag from each node and lets you set the filter yourself.

Hard-coded paths are the first thing to drop. A GenICam node not existing error usually means the code assumed a node the map never declared, and a browser that walks the real tree cannot make that mistake.

Node types your browser must handle

GenICam defines a small set of node interfaces. Read the interface first; the widget, the edit rules and the failure cases all follow from it.

Node interface What it holds Tree view widget
IInteger / IFloat value, range, unit number field clamped to the range
IBoolean true / false check box
IEnumeration symbolic names mapped to integers drop-down of the node's own symbolics
ICommand an action to run button that executes it
IString text text field
ICategory child nodes expandable branch

Fill enumeration drop-downs from the node's own symbolic list, never from a table you wrote by hand — that shortcut is the whole story behind GenICam enumeration invalid value. When a value arrives as an integer from a recipe file, map it to the symbolic name before the write; the integer-to-symbolic mapping article shows the safe order. Commands run asynchronously, so keep the button disabled until the node reports the command done.

SFNC names make the browser portable

The Standard Feature Naming Convention (SFNC), part of the EMVA's GenICam standard, fixes the exact name and expected behaviour of common features: ExposureTime, Gain, Width, Height, PixelFormat, AcquisitionFrameRateEnable. Names travel; categories do not. Two cameras can group the same SFNC names under different branches, and vendors add private categories for their own extensions. Write the browser to search the whole tree by name rather than to walk a fixed path such as AcquisitionControl → ExposureTime, and the same tool reads a GigE camera like the MV-CS200-10GC (20 MP) and a USB3 model without edits.

Area scan camerasHikrobot MV-CS200-10GC 20 MP Area Scan Camera, GigE, IMX183, Color, BasicMV-CS200-10GC
Sensor format
1"
Lens mount
C-mount
Interface
GigE
Resolution
16-25 MP
$739.00View partBuild a system with it

Swapping a legacy SDK's private property names for SFNC ones follows the same logic; the legacy SDK migration guide walks that conversion step by step.

Walk the tree in four steps

  1. Open the camera. The SDK fetches the XML and builds the node map. From here you work only with nodes, never with registers.
  2. Recurse from the root category. For each child, record the display name, interface type, visibility and access mode — read-only, write-only, read-write, or a not-implemented flag.
  3. Build the widget from the interface type, using the table above, and show only the visibility levels you have switched on.
  4. Write with a read-back. Set the value or execute the command, read the node again, and compare. Command nodes finish asynchronously; the one-push autofocus notification article shows the event wait instead of a sleep.

The classic freeze is a browser that polls the node map from the same loop that services the stream. The camera feature browser freeze article is that mistake inside a vendor tool.

Worked example: stream budget for a 4000 × 3000 USB3 camera

LS-CMR-0166 is the example camera here: 4000 × 3000 at 30 fps over USB3.

Area scan cameras12 MP USB3 area scan camera, IMX226, 1/1.7" rolling shutter, 30 fps, 4000 × 3000 resolution (LS-CMR-0166)LS-CMR-0166
Sensor format
1/1.7"
Interface
USB3
Resolution
12 MP
Shutter
Rolling
$560.00View partBuild a system with it

Inputs, and where each comes from:

  • From the tree, read Width = 4000, Height = 3000, PixelFormat = Mono8, AcquisitionFrameRate = 30 fps. The resolution, frame rate and interface match the catalog data for this camera.
  • Mono8 packs 1 byte per pixel — the common mono case this example works.
  • Link budget: USB 3.0 moves 5 Gbit/s raw; after 8b/10b encoding and protocol overhead, a host controller sustains about 400 MB/s of image payload. GigE moves 1 Gbit/s, about 100 MB/s usable.

Rule in words: payload per second is width × height × bytes per pixel × frame rate.

payload (MB/s) = width (px) × height (px) × bytes per pixel × frame rate (fps) ÷ 1,000,000

Arithmetic: 4000 × 3000 = 12,000,000 pixels, so one Mono8 frame is 12 MB. At 30 fps the stream is 12 MB × 30 = 360 MB/s. Against the ~400 MB/s practical USB3 ceiling, 360 ÷ 400 = 0.90 — the stream uses 90 % of the link and leaves about 10 % headroom. The Mono8 ceiling on that link is 400 ÷ 12 ≈ 33 fps. The GigE check fails outright: 360 MB/s against about 100 MB/s usable, a Mono8 ceiling of 100 ÷ 12 ≈ 8 fps.

Decision: keep this camera on USB3 at 30 fps Mono8 — 90 % link use is workable only while nothing else shares the port. Switch PixelFormat to Mono12 packed (1.5 bytes per pixel: 12,000,000 × 1.5 = 18 MB per frame) and the same 30 fps needs 18 MB × 30 = 540 MB/s, past the USB3 ceiling; the fix is 10GigE or CoaXPress, or a reduced ROI. On GigE, cap this resolution near 8 fps Mono8 or crop. Rerun the budget whenever PixelFormat, ROI or frame rate changes — the four tree values are the whole input.

Where a generic browser wins, and where the viewer stays

A generic browser wins in four places. It shows the Expert and Guru nodes a curated interface hides. It works unchanged across mixed fleets and interfaces. It doubles as a scriptable start-up check: enumerate the tree, compare a dozen SFNC values against golden numbers, alarm on drift. And it shows access modes as data, so a write that will fail is greyed out before you click.

It loses on live image display, drawing tools and the guards a vendor viewer puts around dangerous writes. Keep the viewer on the bench for tuning, and point your own code at the tree.

Four errors you will hit first

  • A write comes back read-only. The access mode, a User Set or another application holding exclusive access is in the way. The attribute not writable and node not writable articles separate those three cases.
  • Values lost after a reconnect. The camera booted its default User Set, not the one you configured. The write-protect after reconnection article walks the save-and-load pattern.
  • An integer write rejected on an enumeration. Map to the symbolic name first, as in the node types section above.
  • The tree view freezes mid-stream. The acquisition-thread mistake from the steps section — move enumeration off that thread.

The rest of the attribute-level failure modes are collected on the systems topic page.

Checks before you trust the tool

  • Parse the XML once with explicit encoding handling; a decode error at connect is a loader guess, not a broken camera — the UTF-8 encoding fix article covers that step.
  • Read Width, ExposureTime and PixelFormat, and compare each against the vendor viewer on the same camera. Same names and same numbers mean the enumeration is right.
  • Round-trip one harmless write: set a value, read it back, restore the original.
  • Log the visibility filter and the XML schema version with each session, so a behaviour change after a camera firmware update is traceable.

The decision: build it once, run it everywhere

If your week involves mixed fleets, hidden Expert nodes or automated start-up checks, write the generic browser — walking the map is roughly a day of work, and it keeps paying on the next camera model. If you tune a single camera on one bench, the vendor viewer is enough; do not build interface for its own sake. When viewer and code disagree, the XML decides.

Next step: pick hardware that serves a clean tree from the area scan cameras category and the camera finder, then run the browser on a controller with spare ports — MV-VC3301H-128G66 brings 5+ LAN ports and 3-4 USB 3 ports, and the vision controllers category holds the rest of the range. For a question about a specific camera's XML, the contact page reaches the applications team.

Vision controllersHikrobot MV-VC3301H-128G66 I3-8100, 8GB+128G SSD, No PoE, PCIe expansion supported, Incl. VM6200Pro licenseMV-VC3301H-128G66
LAN ports
5+ LAN ports
USB 3 ports
3-4 USB 3 ports
Light outputs
4 built-in channels
Memory
8 GB
$2,419.00View partBuild a system with it
Build the whole station

The configurator matches a camera, lens, light, light controller and cables to each other, step by step, and lists only parts that fit what you already picked.

Start with the camera

Questions

Why does the same feature sit in a different category on every camera?

SFNC standardizes feature names and their expected behaviour, not the category layout. Vendors group the same names under their own branches and add private categories on top, so two cameras can put ExposureTime in different places. Write the browser to search the whole tree by name instead of assuming a fixed path, and it will run unchanged on cameras with different groupings.

Can I write to features while the camera is streaming?

Some nodes accept writes during acquisition; others lock themselves read-only until the stream stops. The node's access mode in the XML tells you which, and a write that fails mid-stream is handled cleanly by stopping acquisition, setting the feature, then restarting. Poll the tree between frames rather than from a thread that also services the stream, and most mid-session locks disappear.

What visibility level should my browser show by default?

Show Beginner first: it lists the features most inspections touch. Add a toggle for Expert, which exposes frame-rate and test-pattern nodes, and Guru for register-level debugging entries. Keep Invisible hidden — those nodes are infrastructure, and writing them can leave a camera in a state its own viewer struggles to reverse.

Do I need a special camera to browse its feature tree?

No. Any GigE Vision or USB3 Vision camera serves its GenICam XML on connect, so the same browser walks a USB3 model on a controller and a GigE model over the network. The host only needs a spare LAN or USB 3 port and enough CPU for your interface; a fanless vision controller with five or more LAN ports runs a four-camera bench without extra hardware.

What is the difference between the node map and the register map?

The node map is the XML: named, typed features with units, ranges and dependencies. The register map is the raw address space underneath, and the transport layer maps node writes onto it. Work only at node level — a browser that writes raw registers skips the range and dependency checks the XML exists to enforce.