save_image_to_disk.py 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import os
  2. import cv2
  3. import numpy as np
  4. from pyorbbecsdk import *
  5. from utils import frame_to_bgr_image
  6. def save_depth_frame(frame: DepthFrame, index):
  7. if frame is None:
  8. return
  9. width = frame.get_width()
  10. height = frame.get_height()
  11. timestamp = frame.get_timestamp()
  12. scale = frame.get_depth_scale()
  13. depth_format = frame.get_format()
  14. if depth_format != OBFormat.Y16:
  15. print("depth format is not Y16")
  16. return
  17. data = np.frombuffer(frame.get_data(), dtype=np.uint16)
  18. data = data.reshape((height, width))
  19. data = data.astype(np.float32) * scale
  20. data = data.astype(np.uint16)
  21. save_image_dir = os.path.join(os.getcwd(), "depth_images")
  22. if not os.path.exists(save_image_dir):
  23. os.mkdir(save_image_dir)
  24. raw_filename = save_image_dir + "/depth_{}x{}_{}_{}.raw".format(width, height, index, timestamp)
  25. data.tofile(raw_filename)
  26. def save_color_frame(frame: ColorFrame, index):
  27. if frame is None:
  28. return
  29. width = frame.get_width()
  30. height = frame.get_height()
  31. timestamp = frame.get_timestamp()
  32. save_image_dir = os.path.join(os.getcwd(), "color_images")
  33. if not os.path.exists(save_image_dir):
  34. os.mkdir(save_image_dir)
  35. filename = save_image_dir + "/color_{}x{}_{}_{}.png".format(width, height, index, timestamp)
  36. image = frame_to_bgr_image(frame)
  37. if image is None:
  38. print("failed to convert frame to image")
  39. return
  40. cv2.imwrite(filename, image)
  41. def main():
  42. pipeline = Pipeline()
  43. config = Config()
  44. saved_color_cnt: int = 0
  45. saved_depth_cnt: int = 0
  46. has_color_sensor = False
  47. try:
  48. profile_list = pipeline.get_stream_profile_list(OBSensorType.COLOR_SENSOR)
  49. if profile_list is not None:
  50. color_profile: VideoStreamProfile = profile_list.get_default_video_stream_profile()
  51. config.enable_stream(color_profile)
  52. has_color_sensor = True
  53. except OBError as e:
  54. print(e)
  55. depth_profile_list = pipeline.get_stream_profile_list(OBSensorType.DEPTH_SENSOR)
  56. if depth_profile_list is not None:
  57. depth_profile = depth_profile_list.get_default_video_stream_profile()
  58. config.enable_stream(depth_profile)
  59. pipeline.start(config)
  60. while True:
  61. try:
  62. frames = pipeline.wait_for_frames(100)
  63. if frames is None:
  64. continue
  65. if has_color_sensor:
  66. if saved_color_cnt >= 5 and saved_depth_cnt >= 5:
  67. break
  68. elif saved_depth_cnt >= 5:
  69. break
  70. color_frame = frames.get_color_frame()
  71. if color_frame is not None and saved_color_cnt < 5:
  72. save_color_frame(color_frame, saved_color_cnt)
  73. saved_color_cnt += 1
  74. depth_frame = frames.get_depth_frame()
  75. if depth_frame is not None and saved_depth_cnt < 5:
  76. save_depth_frame(depth_frame, saved_depth_cnt)
  77. saved_depth_cnt += 1
  78. except KeyboardInterrupt:
  79. break
  80. if __name__ == "__main__":
  81. main()