使用类的迭代方法读取usb摄像头每一帧图像

import cv2

class LoadUSBcam:
    """
    读取摄像头数据
    """
    INFO = ['fps', 'fw', 'fh', 'bs']

    def __init__(self, pipe='0', **options):
        frameWidth = options.pop('frameWidth', 1280)
        frameHeight = options.pop('frameHeight', 720)
        flip = options.pop('flip', False)
        bufferSize = options.pop('bufferSize', 10)

        self.infoDict = dict()

        if pipe.isnumeric():
            pipe = eval(pipe)
        self.pipe = pipe
        self.flip = flip
        self.cap = cv2.VideoCapture(pipe)

        self.cap.set(cv2.CAP_PROP_BUFFERSIZE, bufferSize)
        self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, frameWidth)
        self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, frameHeight)
        self.fps = int(round(self.cap.get(cv2.CAP_PROP_FPS)))

        self.processeDict()

    def processeDict(self):
        self.infoDict['fps'] = self.fps
        self.infoDict['fw'] = self.cap.get(cv2.CAP_PROP_FRAME_WIDTH)
        self.infoDict['fh'] = self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
        self.infoDict['bs'] = self.cap.get(cv2.CAP_PROP_BUFFERSIZE)

    def __iter__(self):
        self.count = -1
        return self

    def __len__(self):
        return 0

    def __next__(self):
        self.count += 1
        if cv2.waitKey(1) == ord('q'):
            self.cap.release()
            cv2.destroyAllWindows()
            raise StopIteration

        # 读取视频帧
        if self.pipe == 0:
            ret_val, frame = self.cap.read()
            if self.flip:
                frame = cv2.flip(frame, 1)
        else:
            n = 0
            while True:
                n += 1
                self.cap.grab()
                if n % 30 == 0:
                    ret_val, frame = self.cap.retrieve()
                    if ret_val:
                        break

        assert ret_val, f'Camera Error {self.pipe}'
        return frame

    def __getitem__(self, key):
        return self.infoDict[key]

    def getFrameSize(self):
        size = (int(self.cap.get(cv2.CAP_PROP_FRAME_WIDTH)),
                int(self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
        return size

if __name__ == "__main__":
    dataset = LoadUSBcam()
    for frame in dataset:
        cv2.imshow('f', frame)
    cv2.waitKey()

猜你喜欢

转载自blog.csdn.net/athrunsunny/article/details/121650640