import os.path from ctypes import * # 加载ctypes库 class DShowCam: __lib = None __Camid = None class CamInfo(Structure): _fields_ = [("id", c_int), ("name", c_wchar_p)] class PixSize(Structure): _fields_ = [("index", c_int), ("width", c_int), ("height", c_int), ("subtype", c_char_p)] @classmethod def Info(cls): dir = os.path.dirname(os.path.realpath(__file__)) lib = CDLL(os.path.join(dir, "dshowcam.dll")) cam_count = lib.getCount() # 获取相机数量 cam_info = [] lib.getName.restype = c_char_p for i in range(cam_count): cam_name = lib.getName(c_int(i)) cam_info.append(DShowCam.CamInfo(c_int(i), cam_name.decode("utf-8"))) return cam_info @classmethod def Open(cls, Camid): if cls.__lib is None: dir = os.path.dirname(os.path.realpath(__file__)) # cls.__lib = CDLL(os.path.join(dir, "dshowcam.dll")) # 加载动态库 cls.__Camid = c_int(Camid) @classmethod def Close(cls): cls.__lib.Close() cls.__lib = None cls.__Camid = None @classmethod def SizeList(cls): if cls.__lib : pix_list = [] cls.__lib.getSizeCount.restype = c_int list_count = cls.__lib.getSizeCount(cls.__Camid) if list_count > 0: cls.__lib.getSizePix.restype = DShowCam.PixSize for i in range(list_count): pix_size = cls.__lib.getSizePix(c_int(i)) pix_list.append(pix_size) return pix_list @classmethod def Start(cls, bufData, width, height): cls.__lib.Open.argtypes = (c_int, c_int, c_int) cls.__lib.Open.restype = c_int buf_Size = cls.__lib.Open(cls.__Camid, width, height) if bytes(buf_Size) == bufData: cls.__lib.setBuffer.argtypes = (POINTER(c_char),) cls.__lib.setBuffer(bufData) # 创建缓存字节空间 return True else: return False @classmethod def PullImage(cls): cls.__lib.PullImage() # 从相机获取图像 @classmethod def Snap(cls, bufData, width, height): DShowCam.Start(bufData, width, height) cls.__lib.PullImage() # 从相机获取图像 if __name__ == "__main__": try: DShowCam.Open(0, 640, 480) for i in range(20): DShowCam.PullImage() print("pull", i) print("______________") input("press enter to exit") except Exception as e: print('error:', e)
DLL库在另一个文章中下载