import os
from ctypes import *
from PIL import Image
def resolve(name):
f = os.path.join(os.path.dirname(__file__), name)
return f
class CAPTURE_PROPETIES:
CAPTURE_BRIGHTNESS = 1,
CAPTURE_CONTRAST = 2,
CAPTURE_HUE = 3,
CAPTURE_SATURATION = 4,
CAPTURE_SHARPNESS = 5,
CAPTURE_GAMMA = 6,
CAPTURE_COLORENABLE = 7,
CAPTURE_WHITEBALANCE = 8,
CAPTURE_BACKLIGHTCOMPENSATION = 9,
CAPTURE_GAIN = 10,
CAPTURE_PAN = 11,
CAPTURE_TILT = 12,
CAPTURE_ROLL = 13,
CAPTURE_ZOOM = 14,
CAPTURE_EXPOSURE = 15,
CAPTURE_IRIS = 16,
CAPTURE_FOCUS = 17,
CAPTURE_PROP_MAX = 18,
class SimpleCapParms(Structure):
_fields_ = [
("buffer", POINTER(c_int)),
("width", c_int),
("height", c_int),
]
lib = None
def init():
global lib
lib = cdll.LoadLibrary(resolve("escapi32.dll"))
lib.initCapture.argtypes = [c_int, POINTER(SimpleCapParms)]
lib.initCapture.restype = c_int
lib.initCOM()
def device_name(device):
namearry = (c_char * 256)()
lib.getCaptureDeviceName(device, namearry, 256)
camearaname = namearry.value
return camearaname
def init_camera(device, width, height):
array = (width * height * c_int)()
options = SimpleCapParms()
options.width = width
options.height = height
options.buffer = array
lib.initCapture(device, byref(options))
return array
def get_image(device, width, height, array):
lib.doCapture(device)
while lib.isCaptureDone(device) == 0:
pass
img = Image.frombuffer('RGBA', (width, height), array, 'raw', 'BGRA', 0, 0)
return img
def deinit_camera(device):
lib.deinitCapture(device)
class Device():
def __init__(self, device, width, height, array):
self._device = device
self._array = array
self._width = width
self._height = height
@classmethod
def connect(cls, device, width, height):
if not lib:
init()
array = init_camera(device, width, height)
return cls(device, width, height, array)
def disconnect(self):
deinit_camera(self._device)
def get_image(self):
return get_image(self._device, self._width, self._height, self._array)