def set_hdr(self, v=1): print('[INF] dmcam_dev_c.set_hdr(%d)' % v) hdr = dmcam.filter_args_u() if v > 0: dmcam.filter_enable(self.dev, dmcam.DMCAM_FILTER_ID_HDR, hdr, sys.getsizeof(hdr)) else: dmcam.filter_disable(self.dev, dmcam.DMCAM_FILTER_ID_HDR)
def set_auto_arg(self, v=1): print('[INF] dmcam_dev_c.set_auto_arg(%d)' % v) intg_auto_arg = dmcam.filter_args_u() intg_auto_arg.sat_ration = v #自动曝光设置的值 if v > 0: dmcam.filter_enable(self.dev, dmcam.DMCAM_FILTER_ID_AUTO_INTG, intg_auto_arg, sys.getsizeof(intg_auto_arg)) #开启自动曝光 else: dmcam.filter_disable(self.dev,dmcam.DMCAM_FILTER_ID_AUTO_INTG) #关闭自动曝光
def set_pix_calib(self, v=1): print('[INF] dmcam_dev_c.set_pix_calib(%d)' % v) witem = dmcam.filter_args_u() witem.case_idx = v if v > 0: dmcam.filter_enable(self.dev, dmcam.DMCAM_FILTER_ID_PIXEL_CALIB, witem, sys.getsizeof(witem)) else: dmcam.filter_disable(self.dev, dmcam.DMCAM_FILTER_ID_PIXEL_CALIB)
def set_median_filter(self, v=1): print('[INF] dmcam_dev_c.set_median_filter(%d)' % v) witem = dmcam.filter_args_u() witem.median_ksize = v if v > 0: dmcam.filter_enable(self.dev, dmcam.DMCAM_FILTER_ID_MEDIAN, witem, sys.getsizeof(witem)) else: dmcam.filter_disable(self.dev, dmcam.DMCAM_FILTER_ID_MEDIAN)
def set_gauss_filter(self, v=1): print('[INF] dmcam_dev_c.set_gauss_filter(%d)' % v) witem = dmcam.filter_args_u() witem.min_amp = v if v > 0: dmcam.filter_enable(self.dev, dmcam.DMCAM_FILTER_ID_GAUSS, witem, sys.getsizeof(witem)) else: dmcam.filter_disable(self.dev, dmcam.DMCAM_FILTER_ID_GAUSS)
dmcam.PARAM_MOD_FREQ: dmcam.param_val_u(), } # set dual frequency modulation, note that mod_freq0 should always be larger than mod_freq1 # you can trivially set mod_freq1 to zeros, if single frequency modulation is desired wparams[dmcam.PARAM_MOD_FREQ].mod_freq0=100000000 wparams[dmcam.PARAM_MOD_FREQ].mod_freq1=36000000 wparams[dmcam.PARAM_INTG_TIME].intg.intg_us = 1000 wparams[dmcam.PARAM_FRAME_RATE].frame_rate.fps = 20 amp_min_val = dmcam.filter_args_u() amp_min_val.min_amp = 80 if not dmcam.filter_enable(dev, dmcam.DMCAM_FILTER_ID_AMP, amp_min_val, sys.getsizeof(amp_min_val)): print("set amp to %d %% failed" % amp_min_val.min_amp) if not dmcam.param_batch_set(dev, wparams): print(" set parameter failed") print(" Start capture ...") dmcam.cap_start(dev) f = bytearray(640 * 480 * 4 * 2) print(" sampling 100 frames ...") count = 0 run = True vis = o3d.visualization.Visualizer() vis.create_window()
def get_frames(self): if self.dev is None: log.warning("Device not initialized, retry to capture in 0.5s!") time.sleep(0.5) return f = bytearray(320 * 240 * 4 * 2) finfo = dmcam.frame_t() log.debug("dmcam.cap_get_frames") ret = dmcam.cap_get_frames(self.dev, 1, f, finfo) w = finfo.frame_info.width h = finfo.frame_info.height intg_auto_arg = dmcam.filter_args_u() intg_auto_arg.sat_ratio = 5 if not dmcam.filter_enable( self.dev, dmcam.DMCAM_FILTER_ID_AUTO_INTG, intg_auto_arg, sys.getsizeof(intg_auto_arg)): print(" enable AUTO INTG filter (sat_ratio=%d) failed" % intg_auto_arg.sat_ratio) if ret <= 0: if ret == -10: log.warning("dmcam USB cable unplugged, try to reconnect!") self._close_dmcam() self._init_dmcam() self._start_dmcam() elif ret == 0: self.empty_frame_cnt += 1 if self.empty_frame_cnt > 20: log.warning("dmcam capture timeout, restart capture") self._stop_dmcam() self._start_dmcam() self.empty_frame_cnt = 0 else: log.warning("dmcam capture error, errono:{}".format(ret)) self._stop_dmcam() self._start_dmcam() else: self.empty_frame_cnt = 0 print() dist_cnt, dist = dmcam.frame_get_distance(self.dev, w * h, f, finfo.frame_info) # gray_cnt, gray = dmcam.frame_get_gray(self.dev, w * h, f, finfo.frame_info) # gray_data = gray.astype(np.uint16) # gray = ((gray/16).astype(np.uint8)).reshape(240,320) if dist_cnt == w * h: data = (dist * 1000).astype(np.uint16) frame = data.reshape(240, 320) cv2.imshow('frame', cv2.convertScaleAbs(frame, None, 1 / 20)) cv2.waitKey(1) # ## 静态手势 img_s = frame.copy() result_s, result_str = static(img_s) self.result_list = update_win(self.result_list, result_s, win_len=5) ## 动态手势 img_d = frame.copy() img_d = img_d.astype(np.float32) / 10000 self.algo = mainloop_trk(self.algo, img_d, self.viewer, self.bg) self.viewer.put_text(str('手势识别结果为:'), 150, 1000) if result_s > 0 and self.algo.decision == 'point': if self.ENABLE_VIEW: # if len(self.result_list)>0: # counts = np.bincount(self.result_list) # idx = np.argmax(counts) # if idx > 0: # self.viewer.put_text(str(label[idx]),200,1050) self.viewer.put_text(str(result_str), 200, 1000) # final_result = result_str else: x, y = self.algo.xlist[self.algo.idx], self.algo.ylist[ self.algo.idx] if self.ENABLE_VIEW: if self.algo.trace_pattern['type'] != 'point': self.viewer.draw_circle(int(x * 2 + 400), int(y * 2 + 165), r=5, line_wid=5) draw_trace_mode( self.viewer, mode=self.algo.trace_pattern['type'], pos=self.algo.trace_pattern['param']) if self.algo.trace_pattern['type'] == 'circle': self.viewer.put_text(str('转圈'), 215, 1050) elif self.algo.trace_pattern['type'] == 'h-line': self.viewer.put_text(str('水平移动'), 215, 1050) elif self.algo.trace_pattern['type'] == 'v-line': self.viewer.put_text(str('竖直移动'), 215, 1050) # self.result_list=[] # if self.algo.trace_pattern['type'] == 'point': # final_result = 'None' # else: # final_result = self.algo.trace_pattern['type'] # if final_result == "circle": # pos = self.algo.trace_pattern['param'] # update_win(pos_win, pos, win_len=3) # if pos_win[0] < pos_win[1] and pos_win[1]<pos_win[2]: # final_result = "c-circle" # elif pos_win[0] > pos_win[1] and pos_win[1] > pos_win[2]: # final_result = "circle" # if final_result == "h-line": # pos = self.algo.trace_pattern['param'] # update_win(pos_win, pos, win_len=3) # if pos_win[0] < pos_win[1] and pos_win[1]<pos_win[2]: # final_result = "right" # elif pos_win[0] > pos_win[1] and pos_win[1] > pos_win[2]: # final_result = "left" # if final_result == "v-line": # pos = self.algo.trace_pattern['param'] # update_win(pos_win, pos, win_len=3) # if pos_win[0] < pos_win[1] and pos_win[1]<pos_win[2]: # final_result = "down" # elif pos_win[0] > pos_win[1] and pos_win[1] > pos_win[2]: # final_result = "up" # 刷新屏幕显示 if self.ENABLE_VIEW: self.viewer.update() evt, param = self.viewer.poll_evt() if evt == 'quit': return False return True
def _start_dmcam(self): if self.dev is None: log.info(" Open dmcam device ..") self.dev = dmcam.dev_open(None) if self.dev.version.ver.sw_ver < 154: print(u"仅支持固件版本不低于于154的模组设备,当前固件版本{},请升级模组固件,详见Readme".format( self.dev.version.ver.sw_ver)) input("") # win32api.MessageBox(0, u"仅支持固件版本不低于于154的模组设备,当前固件版本{},请升级模组固件,详见Readme".format(self.dev.version.ver.sw_ver), u"错误", win32con.MB_OK) sys.exit(0) # - set capture config - cap_cfg = dmcam.cap_cfg_t() cap_cfg.cache_frames_cnt = 10 # framebuffer = 10 cap_cfg.on_error = None # use cap_set_callback_on_error to set cb cap_cfg.on_frame_rdy = None # use cap_set_callback_on_frame_ready to set cb cap_cfg.en_save_replay = False # True = save replay, False = not save cap_cfg.en_save_dist_u16 = False # True to save dist stream for openni replay cap_cfg.en_save_gray_u16 = False # True to save gray stream for openni replay cap_cfg.fname_replay = os.fsencode( "dm_replay.oni") # set replay filename log.info("Set parameters ...") wparams = { dmcam.PARAM_INTG_TIME: dmcam.param_val_u(), dmcam.PARAM_FRAME_RATE: dmcam.param_val_u(), dmcam.PARAM_FRAME_FORMAT: dmcam.param_val_u(), # dmcam.PARAM_HDR_INTG_TIME: dmcam.param_val_u(), dmcam.PARAM_MOD_FREQ: dmcam.param_val_u() } wparams[dmcam.PARAM_INTG_TIME].intg.intg_us = 250 # wparams[dmcam.PARAM_HDR_INTG_TIME].intg.intg_us = 1000 wparams[dmcam.PARAM_FRAME_RATE].frame_rate.fps = 20 wparams[dmcam.PARAM_FRAME_FORMAT].frame_format.format = 2 wparams[dmcam.PARAM_MOD_FREQ].mod_freq = 12000000 amp_min_val = dmcam.filter_args_u() amp_min_val.min_amp = 60 intg_auto_arg = dmcam.filter_args_u() intg_auto_arg.sat_ration = 100 # 自动曝光设置的值 if not dmcam.filter_enable(self.dev, dmcam.DMCAM_FILTER_ID_AMP, amp_min_val, sys.getsizeof(amp_min_val)): log.error("set amp to %d %% failed" % 0) if not dmcam.filter_disable(self.dev, dmcam.DMCAM_FILTER_ID_MEDIAN): log.error("disable Median Filter failed") # hdr = dmcam.filter_args_u() if not dmcam.filter_disable(self.dev, dmcam.DMCAM_FILTER_ID_HDR): log.error("set hdr failed") if not dmcam.filter_enable( self.dev, dmcam.DMCAM_FILTER_ID_AUTO_INTG, intg_auto_arg, sys.getsizeof(intg_auto_arg)): log.error("set auto intg failed") print("set auto intg failed") else: print("set auto intg") if not dmcam.param_batch_set(self.dev, wparams): log.error("set parameter failed") assert self.dev is not None if not self.status: log.info("Start capture ...") dmcam.cap_start(self.dev) self.status = True