示例#1
0
class StreamReader :
    def __init__(self) :
        self._server = None
        self._capturedDevice = None
        pass

    def connect(self, addr = '127.0.0.1', port = 4242) :
        try:
            self._server = Socket()
            statusCode = self._server.connect_ex((addr, port))
            if statusCode != 0 :
                raise statusCode
        except :
            self.connectLocalCamera()

    def connectLocalCamera(self) :
        self.close()
        qem = QErrorMessage()
        qem.showMessage('Не удаётся подключиться к Raspberry Pi: Будет подключена локальная камера')
        qem.exec()
        self._capturedDevice = cv2.VideoCapture(0)    

    def releseLocalCamera(self) :
        self._capturedDevice.relese()
        self._capturedDevice = None

    def __del__(self) :
        self.close()

    def getFrame(self) :
        if self._server is not None :
            try: 
                return self._getFrameFromRemoteCamera() 
            except: 
                self.connectLocalCamera()

        if self._capturedDevice is not None :
            try: 
                return self._getFrameFromLocalCamera() 
            except: 
                raise CannotReadFrame
        raise CannotReadFrame


    def _getFrameFromRemoteCamera(self) :
        self._server.sendObject('get_frame')
        frame = self._server.recvObject()
        return cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

    def _getFrameFromLocalCamera(self) :
        retVal, frame = self._capturedDevice.read()
        if retVal == False :
            raise CannotReadFrame
        return cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

    def readable(self) :
        #заглушка
        return True

    def recvall(self, sock, size) :
        binary = sock.recv(size)
        diff = size - len(binary)
        while diff :
            buf = sock.recv(diff)
            diff = diff - len(buf)
            binary = binary + buf
        return binary

    def close(self) :
        if self._capturedDevice is not None :
            self._capturedDevice.release()
            self._capturedDevice = None
        if self._server is not None :
            try:
                #self._server.sendObject('close_conection')
                self._server.sendObject('exit')
                self._server.close()
            except:
                pass
            finally:
                self._server = None