# pymba

pymba is a Python wrapper for the Allied Vision Technologies (AVT) Vimba C API. It wraps the VimbaC.dll file included in the AVT Vimba installation to provide a simple Python interface for AVT cameras. It currently supports most of the functionality provided by VimbaC.dll.

## Installation

Install the Vimba SDK from AVT to the default directory.

Run the AVTDriverInstaller tool and install the AVT Vimba SDK drivers.

Install pymba.

## Usage

### Testing installation 

If Vimba and pymba are installed correctly, then the following code examples should give the installed Vimba version. No camera is needed.

Checking the version using a context manager:

    from pymba import *
    
    with Vimba() as vimba:
        print(vimba.getVersion())
	
Or without using a context manager:

    from pymba import *
    
    vimba = Vimba()
    vimba.startup()
    print(vimba.getVersion())
    vimba.shutdown()

### Interacting with cameras

Discover, open, manipulate, and capture frames from a camera.
    
    from pymba import *
    import time
    
    # start Vimba
    with Vimba() as vimba:
        # get system object
        system = vimba.getSystem()
        
        # list available cameras (after enabling discovery for GigE cameras)
        if system.GeVTLIsPresent:
            system.runFeatureCommand("GeVDiscoveryAllOnce")
            time.sleep(0.2)
        cameraIds = vimba.getCameraIds()
        for cameraId in cameraIds:
            print(cameraId)
        
        # get and open a camera
        camera0 = vimba.getCamera(cameraIds[0])
        camera0.openCamera()
        
        # list camera features
        cameraFeatureNames = camera0.getFeatureNames()
        for name in cameraFeatureNames:
            print(name)
        
        # get the value of a feature
        print(camera0.AcquisitionMode)
        
        # set the value of a feature
        camera0.AcquisitionMode = 'SingleFrame'
        
        # create new frames for the camera
        frame0 = camera0.getFrame()    # creates a frame
        frame1 = camera0.getFrame()    # creates a second frame
        
        # announce frame
        frame0.announceFrame()
        
        # capture a camera image
        camera0.startCapture()
        frame0.queueFrameCapture()
        camera0.runFeatureCommand('AcquisitionStart')
        camera0.runFeatureCommand('AcquisitionStop')
        frame0.waitFrameCapture()
        
        # get image data...
        imgData = frame0.getBufferByteData()
        
        # ...or use NumPy for fast image display (for use with OpenCV, etc)
        import numpy as np
        moreUsefulImgData = np.ndarray(buffer = frame0.getBufferByteData(),
                                       dtype = np.uint8,
                                       shape = (frame0.height,
                                                frame0.width,
                                                1))
        
        # clean up after capture
        camera0.endCapture()
        camera0.revokeAllFrames()
        
        # close camera
	
### Interacting with the Vimba system
    
Get a reference to the Vimba system object and list available system features.
    
    from pymba import *
    
    with Vimba() as vimba:
        # get system object
        system = vimba.getSystem()
        
        # list system features
        for featureName in system.getFeatureNames():
            print(featureName)

### Interacting with transport layer interfaces
    
Get a reference to an interface object and list available interface features.
    
    from pymba import *
    
    with Vimba() as vimba:
        # get list of available interfaces
        interfaceIds = vimba.getInterfaceIds()
        for interfaceId in interfaceIds:
            print(interfaceId)
        
        # get interface object and open it
        interface0 = vimba.getInterface(interfaceIds[0])
        interface0.openInterface()
        
        # list interface features
        interfaceFeatureNames = interface0.getFeatureNames()
        for name in interfaceFeatureNames:
            print(name)
        
        # close interface
        interface0.closeInterface()



### Handling Vimba exceptions

    from pymba import *

    try:
        with Vimba() as vimba:
    except VimbaException as e:
        print(e.message)
    


## Known issues

* Not all API functions are wrapped (most are). For full list see vimbadll.py.

