tofManager.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. import etc_pb2 as etc
  2. import os, glog, numpy, cv2, SDK.ZX.tool, json, time
  3. from tofDevice import *
  4. import SDK.Vzense.VzenseDS_api as tof
  5. class TofManager:
  6. def saveIrFrame2Image(self, path, name, frame):
  7. frametmp = numpy.ctypeslib.as_array(frame.pFrameData, (1, frame.dataLen))
  8. frametmp.dtype = numpy.uint8
  9. frametmp.shape = (frame.height, frame.width)
  10. if not os.path.exists(path):
  11. os.makedirs(path)
  12. filename = path + name
  13. cv2.imwrite(filename, frametmp, [cv2.IMWRITE_JPEG_QUALITY, 100])
  14. def saveDepthFrame2Image(self, path, name, frame):
  15. frametmp = numpy.ctypeslib.as_array(frame.pFrameData, (1, frame.width * frame.height * 2))
  16. frametmp.dtype = numpy.uint16
  17. frametmp.shape = (frame.height, frame.width)
  18. # convert ushort value to 0xff is just for display
  19. img = numpy.int32(frametmp)
  20. img = img * 255 / c_uint16(7495)
  21. img = numpy.clip(img, 0, 255)
  22. img = numpy.uint8(img)
  23. frametmp = cv2.applyColorMap(img, cv2.COLORMAP_RAINBOW)
  24. if not os.path.exists(path):
  25. glog.info(path + " not exists, mkdit it.")
  26. os.makedirs(path)
  27. filename = path + name
  28. cv2.imwrite(filename, frametmp, [cv2.IMWRITE_JPEG_QUALITY, 100])
  29. def __init__(self):
  30. self.etc_file = os.path.dirname(os.path.abspath(__file__)) + "/etc/device.json"
  31. self.tofs_etc = {}
  32. self.updateTofsEtc()
  33. self.camera = tof.VzenseTofCam()
  34. self.camera_list = {}
  35. self.search_flag = False
  36. self.liscenFunc = [["getCameraFrame", self.getCameraFrame],
  37. ["updateTofsEtc", self.updateTofsEtc],
  38. ["getCameraEtc", self.getCameraEtc],
  39. ["getAllCameraEtc", self.getAllCameraEtc],
  40. ["getCameraList", self.getCameraList],
  41. ["searchAllCamera", self.searchAllCamera],
  42. ["openCamera", self.openCamera],
  43. ["openAllCamera", self.openAllCamera],
  44. ["closeCamera", self.closeCamera],
  45. ["closeAllCamera", self.closeAllCamera],
  46. ["startCameraStream", self.startCameraStream],
  47. ["startAllCameraStream", self.startAllCameraStream],
  48. ["stopCamera", self.stopCamera],
  49. ["stopAllCameraStream", self.stopAllCameraStream],
  50. ["getCameraFrame", self.getCameraFrame],
  51. ["test", self.test],
  52. ["loopGetCameraFrame", self.loopGetCameraFrame]
  53. ]
  54. # self.t1 = threading(target=func, args=('第一个线程', 1))
  55. def test(self, data):
  56. glog.info(data)
  57. def exec(self, req_data):
  58. try:
  59. json_data = json.loads(req_data.statu)
  60. glog.info(json_data)
  61. if type(json_data) != dict:
  62. glog.warning("receive data not is dict")
  63. return
  64. for bind_func in self.liscenFunc:
  65. if json_data["func"] == bind_func[0] and type(json_data["params"]) == dict:
  66. bind_func[1](json_data["params"])
  67. return
  68. glog.warning(json_data["params"])
  69. # {"func": "test", "params": {"id": 1}}
  70. except ValueError as e:
  71. glog.error(req_data.statu)
  72. def updateTofsEtc(self, receive_data=""):
  73. etc_proto = SDK.ZX.tool.getProtobufJsonConfig(self.etc_file, etc.DevicesConfig())
  74. for tof_etc in etc_proto.devices:
  75. self.tofs_etc[tof_etc.id] = tof_etc
  76. glog.info(self.tofs_etc)
  77. self.search_flag = False
  78. def getCameraEtc(self, receive_data=""):
  79. id = receive_data["id"]
  80. return self.tofs_etc[id]
  81. def getAllCameraEtc(self, receive_data=""):
  82. return self.tofs_etc
  83. def getCameraList(self, receive_data=""):
  84. return self.camera_list
  85. def searchAllCamera(self, receive_data=""):
  86. # 搜索相机,会确保配置中启用的相机全部搜索到
  87. camera_count = self.camera.VZ_GetDeviceCount()
  88. retry_count = 60
  89. device_ip_list = []
  90. while camera_count <= len(self.tofs_etc) and retry_count > 0:
  91. ret, deviceInfoList = self.camera.VZ_GetDeviceInfoList()
  92. retry_count = retry_count - 1
  93. camera_count = self.camera.VZ_GetDeviceCount()
  94. if camera_count > 0:
  95. device_ip_list = []
  96. for i in range(camera_count):
  97. device_ip_list.append(deviceInfoList[i].ip)
  98. find_device_count = 0
  99. for tof_etc in self.tofs_etc:
  100. if self.tofs_etc[tof_etc].enable is False:
  101. find_device_count = find_device_count + 1
  102. glog.info(self.tofs_etc[tof_etc].ipv4 + " not enable.")
  103. if find_device_count == len(self.tofs_etc):
  104. self.search_flag = True
  105. return self.search_flag
  106. continue
  107. if self.tofs_etc[tof_etc].ipv4.encode() not in device_ip_list:
  108. glog.info("find a device " + self.tofs_etc[tof_etc].ipv4 + " fulture.")
  109. break
  110. else:
  111. find_device_count = find_device_count + 1
  112. glog.info("find a device " + self.tofs_etc[tof_etc].ipv4 + " success.")
  113. if find_device_count == len(self.tofs_etc):
  114. self.search_flag = True
  115. return self.search_flag
  116. time.sleep(0.5)
  117. glog.info("scaning...... " + str(retry_count) + " already scanned" + str(camera_count) + " devices.")
  118. return self.search_flag
  119. def openCamera(self, receive_data=""):
  120. id = receive_data["id"]
  121. if id in self.camera_list:
  122. glog.info("camera " + self.tofs_etc[id].ipv4 + " already opend.")
  123. return tof.VzReturnStatus.VzRetOK
  124. if self.tofs_etc[id].enable is False:
  125. glog.warning(
  126. "this camera not enabled in etc fiile, if you want to enable it, please update the file, and then use func updateTofsEtc.")
  127. return tof.VzReturnStatus.VzRetOthers
  128. cam = tof.VzenseTofCam()
  129. ret = cam.VZ_OpenDeviceByIP(self.tofs_etc[id].ipv4.encode())
  130. if ret == 0:
  131. glog.info(self.tofs_etc[id].ipv4 + " open successful")
  132. self.camera_list[id] = cam
  133. else:
  134. glog.info(self.tofs_etc[id].ipv4 + ' VZ_OpenDeviceByIP failed: ' + str(ret))
  135. def openAllCamera(self, receive_data=""):
  136. for tof_etc in self.tofs_etc:
  137. if self.tofs_etc[tof_etc].enable is False:
  138. continue
  139. cam = tof.VzenseTofCam()
  140. ret = cam.VZ_OpenDeviceByIP(self.tofs_etc[tof_etc].ipv4.encode())
  141. if ret == 0:
  142. glog.info(self.tofs_etc[tof_etc].ipv4 + " open successful")
  143. self.camera_list[tof_etc] = cam
  144. else:
  145. glog.info(self.tofs_etc[tof_etc].ipv4 + ' VZ_OpenDeviceByIP failed: ' + str(ret))
  146. def closeCamera(self, receive_data=""):
  147. id = receive_data["id"]
  148. if (id not in self.camera_list):
  149. glog.info("camera " + self.tofs_etc[id].ipv4 + " already closed.")
  150. return tof.VzReturnStatus.VzRetOK
  151. ret = self.camera_list[id].VZ_CloseDevice()
  152. if ret == 0:
  153. del self.camera_list[id]
  154. glog.info("close device " + str(self.tofs_etc[id].ipv4) + " successful")
  155. else:
  156. glog.warning("VZ_CloseDevice " + str(self.tofs_etc[id].ipv4) + " failed: " + str(ret))
  157. return ret
  158. def closeAllCamera(self, receive_data=""):
  159. for id in self.camera_list:
  160. ret = self.camera_list[id].VZ_CloseDevice()
  161. if ret == 0:
  162. glog.info("close device " + str(self.tofs_etc[id].ipv4) + " successful")
  163. else:
  164. glog.warning("VZ_CloseDevice " + str(self.tofs_etc[id].ipv4) + " failed: " + str(ret))
  165. self.camera_list.clear()
  166. def startCameraStream(self, receive_data=""):
  167. id = receive_data["id"]
  168. if id in self.camera_list:
  169. ret = self.camera_list[id].VZ_StartStream()
  170. if ret == 0:
  171. glog.info(self.tofs_etc[id].ipv4 + " start stream successful")
  172. else:
  173. glog.info(self.tofs_etc[id].ipv4 + ' VZ_StartStream failed: ' + str(ret))
  174. else:
  175. glog.warning("camera " + self.tofs_etc[id].ip + "not open, please open this camera")
  176. def startAllCameraStream(self, receive_data=""):
  177. for id in self.camera_list:
  178. ret = self.camera_list[id].VZ_StartStream()
  179. if ret == 0:
  180. glog.info(self.tofs_etc[id].ipv4 + " start stream successful")
  181. else:
  182. glog.info(self.tofs_etc[id].ipv4 + ' VZ_StartStream failed: ' + str(ret))
  183. def stopCamera(self, receive_data=""):
  184. id = receive_data["id"]
  185. if id in self.camera_list:
  186. ret = self.camera_list[id].VZ_StopStream()
  187. if ret == 0:
  188. glog.info(self.tofs_etc[id].ipv4 + " stop stream successful")
  189. else:
  190. glog.info(self.tofs_etc[id].ipv4 + ' VZ_StopStream failed: ' + str(ret))
  191. else:
  192. glog.warning("camera " + self.tofs_etc[id].ip + "not open, please open this camera")
  193. def stopAllCameraStream(self, receive_data=""):
  194. for id in self.camera_list:
  195. ret = self.camera_list[id].VZ_StopStream()
  196. if ret == 0:
  197. glog.info(self.tofs_etc[id].ipv4 + " stop stream successful")
  198. else:
  199. glog.info(self.tofs_etc[id].ipv4 + ' VZ_StopStream failed: ' + str(ret))
  200. def getCameraFrame(self, receive_data=""):
  201. id, path, depth_name, ir_name = 0, "", "", ""
  202. if "id" not in receive_data or "path" not in receive_data:
  203. return
  204. id = receive_data["id"]
  205. path = receive_data["path"]
  206. if "depth_name" in receive_data:
  207. depth_name = receive_data["depth_name"]
  208. if "ir_name" in receive_data:
  209. ir_name = receive_data["ir_name"]
  210. if id == "" or path == "":
  211. return
  212. if id in self.camera_list:
  213. ret, frameready = self.camera_list[id].VZ_GetFrameReady(c_uint16(1000))
  214. if ret != 0:
  215. glog.error("VZ_GetFrameReady failed: %d", ret)
  216. return
  217. if frameready.depth and depth_name != "":
  218. ret, depthframe = self.camera_list[id].VZ_GetFrame(tof.VzFrameType.VzDepthFrame)
  219. if ret == 0:
  220. self.saveDepthFrame2Image(path, depth_name + ".jpg", depthframe)
  221. glog.info(self.tofs_etc[id].ipv4 + " depth frameindex: " + str(depthframe.frameIndex))
  222. else:
  223. glog.warning("VZ_GetFrame error %d", ret)
  224. if frameready.ir and ir_name != "":
  225. ret, irframe = self.camera_list[id].VZ_GetFrame(tof.VzFrameType.VzIRFrame)
  226. if ret == 0:
  227. self.saveIrFrame2Image(path, ir_name + ".jpg", irframe)
  228. glog.info(self.tofs_etc[id].ipv4 + " ir frameindex: " + str(irframe.frameIndex))
  229. else:
  230. glog.warning("VZ_GetFrame error %d", ret)
  231. def loopGetCameraFrame(self, receive_data=""):
  232. path, times, interval = 0, 0, 0
  233. if "path" not in receive_data or "times" not in receive_data or "interval" not in receive_data:
  234. return
  235. times = receive_data["times"]
  236. interval = receive_data["interval"]
  237. if interval < 0.2:
  238. interval = 0.2
  239. while times:
  240. receive_data["depth_name"] = "Depth_" + str(receive_data["times"] - times + 1)
  241. receive_data["ir_name"] = "Ir_" + str(receive_data["times"] - times + 1)
  242. glog.info(receive_data)
  243. self.getCameraFrame(receive_data)
  244. times = times - 1
  245. time.sleep(interval)
  246. def setCameraEtc(self, ip, tof_etc=etc.VzenseTofDevices()):
  247. glog.info("=======================")