Exemplo n.º 1
0
 def start_record(self, name='test', total_time=20, fps=20, width=640, height=480, code='MJPG', **kwargs):
     try:
         self.start_camera(**kwargs)
         rec = threading.Thread(target=self.record_video, args=(name, total_time, fps, width, height, code))
         rec.setDaemon(False)
         rec.start()
     except Exception as e:
         logger.error("start_record: {}".format(e))
Exemplo n.º 2
0
 def _take_frame(self, name='test.png', gray=False):
     try:
         name = str(name)
         ret, frame = self.capture.read()
         if ret:
             if gray:
                 frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
             cv2.imwrite(name, frame)
         else:
             logger.error("Camera read frame error.")
             return -1
     except Exception as e:
         logger.error("_take_frame: {}".format(e))
Exemplo n.º 3
0
 def _record(self, name='test.avi', fps=20, time_=20, width=640, height=480, code='MJPG'):
     try:
         name = str(name)
         time_ = int(time_)
         fps = float(fps)
         if fps < 5 or fps > 30:
             fps = self.fps
         else:
             self.fps = fps
         code = str(code)
         fourcc = cv2.VideoWriter_fourcc(*code)
         if code.lower() == 'none':
             fourcc = -1
         out = cv2.VideoWriter(name, fourcc, fps, (width, height), True)
         self._start_time = time.time()
         logger.info("Start to record video: <{}> at time: {}".format(name, self._start_time))
         self.frameCnt = 0
         while self.capture.isOpened():
             ret, self.frame = self.capture.read()
             if self._mark['mark']:
                 self._mark['text'] = self._utils.get_time_as_string()
                 cv2.putText(self.frame, self._mark['text'], (self._mark['x'], self._mark['y']),
                             cv2.FONT_HERSHEY_SIMPLEX, self._mark['fontScale'],
                             (self._mark['R'], self._mark['G'], self._mark['B']), self._mark['thick'],
                             cv2.LINE_AA)
             if ret:
                 out.write(self.frame)
                 self.frameCnt += 1
             self._check_time = time.time()
             if int(self._check_time - self._start_time) >= (time_ * 60):
                 break
             if self.stopRecord:
                 break
         out.release()
         logger.info("Stop record video: <{}> at time: {}, or {}sec, total frame: {}"
                     .format(name, self._check_time, int(self._check_time - self._start_time), self.frameCnt))
     except Exception as e:
         logger.error("_record : {}".format(e))
Exemplo n.º 4
0
    def start_record(self, name='test', total_time=20, fps=20, width=640, height=480, code='MJPG', **kwargs):
        """
        功能:录制视频开启线程

        参数:name:保存视频的名称,不包含后缀名

                total_time:录制视频的总时长,单位:分钟

                fps:帧率设置[5.0, 30.0], default=20

                kwargs : 可设置的摄像头参数

        返回:无

        示例:start_record()
        """
        try:
            self.start_camera(**kwargs)
            rec = threading.Thread(target=self.record_video, args=(name, total_time, fps, width, height, code))
            rec.setDaemon(False)
            rec.start()
            # rec.join()
        except Exception as e:
            logger.error("start_record: {}".format(e))
Exemplo n.º 5
0
    def _take_frame(self, name='test.png', gray=False):
        """
        功能:获取一帧图像并保存

        参数:name:保存照片的名称或路径:test.png or D:/GIT/automatedtest_5X3/test.png

            gray:[False:拍摄彩色照片, True:拍摄灰度照片]

        返回:无

        示例:_take_frame('name.png')
        """
        try:
            name = str(name)
            ret, frame = self.capture.read()
            if ret:
                if gray:
                    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
                cv2.imwrite(name, frame)
            else:
                logger.error("Camera read frame error.")
                return -1
        except Exception as e:
            logger.error("_take_frame: {}".format(e))
Exemplo n.º 6
0
 def check_signal(self, signals):
     """
     检查Signal信号是否正确。
     :param signals: 信号对象,可以是CAN消息中的信号(字典类型),也可以是8位数字的信号(列表类型)
     :return:
             如果是列表则校验每位必须小于0XFF且大于0,否则返回False
             如果是字典则分为{"IP_EngineOffTime":0x2}和{"0-5":0x2}两种模式
             1. 所有信号能从dbc中找到且属于同一个message,且value处于最大值和最小值之间则返回True
             2. 如果bit-length有重叠或者value超出了最大最小值,则返回False
     """
     # 只允许传入dict或者list类型
     if not isinstance(signals, (list, dict)):
         logger.warn(f"signals({signals}) type is not list or dict")
         return False
     result = True
     # 如果是list类型,不校验8位,只校验每个byte都必须小于0XFF
     if isinstance(signals, list):
         logger.debug(f"Signals({signals}) is list")
         if 8 != len(signals):
             logger.error("signals length is not equal 8 Byte")
             return False
         for value in signals:
             result = result and self._tools.check_value(value, 0, 0xff)
         return result
     else:
         # 获取keys
         keys = list(signals.keys())
         if not self._tools.check_signal_type(keys):
             logger.warn("Signals key must be same type")
             return False
         # 名字模式
         # a. 能否从dbc文件中找到该signal,
         # b. 所有signal是否为同一个message
         # c. value是否处于每个signal的最大最小值之间
         if keys[0].find("-") == -1:
             logger.debug("name mode check")
             return self.check_signal_in_dbc(
                 keys) and self.is_signals_in_msg(
                     keys) and self.check_signal_value(signals)
         # 数字模式
         # a. 检查value是不是超出最大值
         # b. 检查bit-length是否重叠
         else:
             message_list = []
             for x in range(64):
                 message_list.append(True)
             for key in keys:
                 value = signals[key]
                 start, length = key.split("-")
                 start = int(start)
                 length = int(length)
                 if not (self._tools.check_value(start, 0, 0x3f)
                         and self._tools.check_value(length, 0, 0x3f)):
                     logger.warn(
                         f"start({start}) and length({length}) not in [0, 63]"
                     )
                     return False
                 else:
                     result = result and self._tools.check_value(
                         value, 0, (2**length) - 1)
                 real_start = self._tools.get_position(start)
                 for i in range(real_start, (real_start - length), -1):
                     if message_list[i]:
                         message_list[i] = False
                     else:
                         logger.warn(
                             f"start-bit area is overlapping start({start}) + length({length})"
                         )
                         return False
     return result
Exemplo n.º 7
0
    def _record(self, name='test.avi', fps=20, time_=20, width=640, height=480, code='MJPG'):
        """
        功能:录制

        参数:name:保存视频的名称或路径:test.avi or D:/GIT/automatedtest_5X3/test.avi

            fps:帧率设置[5.0, 30.0], default=20

            t:每段录像的时长,达到该时间后自动保存录像并开启新的录像写入另一个视频文件,单位:minutes,
                如果t=0则保存为一个视频文件, 默认值:t=20

            width, height : 录像视屏的分辨率

            code:录像的编码格式,目前只支持MJPG

        返回:无

        示例:_record('name.avi')
        """
        try:
            name = str(name)
            time_ = int(time_)
            fps = float(fps)
            if fps < 5 or fps > 30:
                fps = self.fps
            else:
                self.fps = fps
            code = str(code)
            # 各种编码格式每分钟压缩后大小:MJPG(80M),
            fourcc = cv2.VideoWriter_fourcc(*code)
            if code.lower() == 'none':
                fourcc = -1
            out = cv2.VideoWriter(name, fourcc, fps, (width, height), True)
            self._start_time = time.time()
            logger.info("Start to record video: <{}> at time: {}".format(name, self._start_time))
            self.frameCnt = 0
            while self.capture.isOpened():
                ret, self.frame = self.capture.read()
                if self._mark['mark']:
                    self._mark['text'] = self._utils.get_time_as_string()
                    cv2.putText(self.frame, self._mark['text'], (self._mark['x'], self._mark['y']),
                                cv2.FONT_HERSHEY_SIMPLEX, self._mark['fontScale'],
                                (self._mark['R'], self._mark['G'], self._mark['B']), self._mark['thick'],
                                cv2.LINE_AA)
                if ret:
                    out.write(self.frame)
                    self.frameCnt += 1
                    # cv2.imshow('f', self.frame)
                    # if cv2.waitKey(1) & 0xFF == ord('q'):
                    #    break
                self._check_time = time.time()
                if int(self._check_time - self._start_time) >= (time_ * 60):
                    break
                if self.stopRecord:
                    break
            out.release()
            logger.info("Stop record video: <{}> at time: {}, or {}sec, total frame: {}"
                        .format(name, self._check_time, int(self._check_time - self._start_time), self.frameCnt))
            # cv2.destroyAllWindows()
        except Exception as e:
            logger.error("_record : {}".format(e))