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))
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))
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))
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))
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))
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
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))