""" A simple python wrapper around escapi Usage: from camera import Device device = Deveice.connect(0, 500, 500) image = device.get_image() """ import os import platform import sys from ctypes import * from PIL import Image import numpy as np import cv2 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), ("fps", c_int), ] lib = None def init(): global lib if platform.architecture()[0] == '32bit': dll_path = resolve(os.path.join("escapi", "escapi_x86.dll")) lib = cdll.LoadLibrary(dll_path) else: dll_path = resolve(os.path.join("escapi", "escapi_x64.dll")) lib = cdll.LoadLibrary(dll_path) if lib is None or lib.ESCAPIVersion() != 0xfff001: print("Invalid ESCAPI DLL found.") sys.exit(1) lib.initCapture.argtypes = [c_int, POINTER(SimpleCapParms)] lib.initCapture.restype = c_int lib.initCOM() def count_capture_devices(): return lib.countCaptureDevices() def device_name(device): """ Get the device name for the given device :param device: The number of the device :return: The name of the device """ namearry = (c_char * 256)() lib.getCaptureDeviceName(device, namearry, 256) camearaname = namearry.value return camearaname def init_camera(device, width, height, fps): global devices array = (width * height * c_int)() options = SimpleCapParms() options.width = width options.height = height options.fps = fps options.buffer = array lib.initCapture(device, byref(options)) return array def do_capture(device): lib.doCapture(device) def is_capture_done(device): return lib.isCaptureDone(device) def read(device, width, height, array): if is_capture_done(device): img = Image.frombuffer('RGBA', (width, height), array, 'raw', 'BGRA', 0, 1) img = np.array(img) img = cv2.cvtColor(img, cv2.COLOR_RGBA2BGR); return img else: return None 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) img = np.array(img) img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR); return img def deinit_camera(device): lib.deinitCapture(device)