使用DirectShow库做的相机python dll链接库

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库在另一个文章中下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值