Intel Realsense D435 通过识别目标的像素坐标和深度值(使用内参intrinsics)获取目标点的真实坐标
生活随笔
收集整理的這篇文章主要介紹了
Intel Realsense D435 通过识别目标的像素坐标和深度值(使用内参intrinsics)获取目标点的真实坐标
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Intel Realsense D435 通過識別目標的像素坐標和深度值(使用內參intrinsics)獲取目標點的真實坐標
- 圖原理
- 基本獲取內參`intrinsics`代碼
- 實操代碼1(在`tensorflow-yolov3`中獲取內參)
- 實操代碼2(在`tensorflow-yolov3` `draw_bbox()`函數中實現坐標轉換操作)
圖原理
對付fy同理
(0,0)位置為D435 RGB攝像頭對應點位置
基本獲取內參intrinsics代碼
import pyrealsense2 as rspipeline = rs.pipeline() config = rs.config() config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30) config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30) profile = pipeline.start(config) frames = pipeline.wait_for_frames() depth = frames.get_depth_frame() color = frames.get_color_frame()# 獲取內參 depth_profile = depth.get_profile() # print(depth_profile) # <pyrealsense2.video_stream_profile: 1(0) 640x480 @ 30fps 1> # print(type(depth_profile)) # <class 'pyrealsense2.pyrealsense2.stream_profile'> # print(depth_profile.fps()) # 30 # print(depth_profile.stream_index()) # 0 # print(depth_profile.stream_name()) # Depth # print(depth_profile.stream_type()) # stream.depth # print('', depth_profile.unique_id) # <bound method PyCapsule.unique_id of <pyrealsense2.video_stream_profile: 1(0) 640x480 @ 30fps 1>>color_profile = color.get_profile() # print(color_profile) # <pyrealsense2.video_stream_profile: 2(0) 640x480 @ 30fps 6> # print(type(color_profile)) # <class 'pyrealsense2.pyrealsense2.stream_profile'> # print(depth_profile.fps()) # 30 # print(depth_profile.stream_index()) # 0cvsprofile = rs.video_stream_profile(color_profile) dvsprofile = rs.video_stream_profile(depth_profile)color_intrin = cvsprofile.get_intrinsics() # print(color_intrin.fx) # 616.5906372070312 # print(color_intrin) # width: 640, height: 480, ppx: 318.482, ppy: 241.167, fx: 616.591, fy: 616.765, model: 2, coeffs: [0, 0, 0, 0, 0]# depth_intrin = dvsprofile.get_intrinsics() # print(depth_intrin) # width: 640, height: 480, ppx: 317.78, ppy: 236.709, fx: 382.544, fy: 382.544, model: 4, coeffs: [0, 0, 0, 0, 0]# extrin = depth_profile.get_extrinsics_to(color_profile) # print(extrin) # rotation: [0.999984, -0.00420567, -0.00380472, 0.00420863, 0.999991, 0.00076919, 0.00380145, -0.00078519, 0.999992] # translation: [0.0147755, 0.000203265, 0.00051274]實操代碼1(在tensorflow-yolov3中獲取內參)
# 先獲取對齊流,得到color_intrin后,將對齊后的流通過比例關系將目標的像素坐標轉換為實際坐標。 # 我們這使用的識別框架為Tensorflow-yolov3 import pyrealsense2 as rspipeline = rs.pipeline() config = rs.config() config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30) config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)pipeline.start(config)# 創建對齊對象(深度對齊顏色) align = rs.align(rs.stream.color)try:while True:frames = pipeline.wait_for_frames()# 獲取對齊幀集aligned_frames = align.process(frames)# 獲取對齊后的深度幀和彩色幀aligned_depth_frame = aligned_frames.get_depth_frame()color_frame = aligned_frames.get_color_frame()# 獲取顏色幀內參color_profile = color_frame.get_profile()cvsprofile = rs.video_stream_profile(color_profile)color_intrin = cvsprofile.get_intrinsics()color_intrin_part = [color_intrin.ppx, color_intrin.ppy, color_intrin.fx, color_intrin.fy]# print(color_intrin_part)# [318.48199462890625, 241.16720581054688, 616.5906372070312, 616.7650146484375]if not aligned_depth_frame or not color_frame:continue實操代碼2(在tensorflow-yolov3 draw_bbox()函數中實現坐標轉換操作)
# video_demo.py文件中: image = utils.draw_bbox(frame, bboxes, aligned_depth_frame, color_intrin_part) # utils.py文件中: def draw_bbox(image, bboxes, aligned_depth_frame, color_intrin_part, classes=read_class_names(cfg.YOLO.CLASSES),show_label=True):print('*' * 50)# 提取ppx,ppy,fx,fyppx = color_intrin_part[0]ppy = color_intrin_part[1]fx = color_intrin_part[2]fy = color_intrin_part[3]for i, bbox in enumerate(bboxes):if show_label:target_xy_pixel = [int(round((coor[0] + coor[2]) / 2)), int(round((coor[1] + coor[3]) / 2))]target_depth = aligned_depth_frame.get_distance(target_xy_pixel[0], target_xy_pixel[1])target_xy_true = [(target_xy_pixel[0] - ppx) * target_depth / fx,(target_xy_pixel[1] - ppy) * target_depth / fy]print('識別出目標:{} 中心點像素坐標:({}, {}) 實際坐標(mm):({:.3f},{:.3f}) 深度(mm):{:.3f}'.format(classes[class_ind],target_xy_pixel[0],target_xy_pixel[1],target_xy_true[0] * 1000,-target_xy_true[1] * 1000,target_depth * 1000))**************************************************識別出目標:person 中心點像素坐標:(272, 142) 實際坐標(mm):(-160,341) 深度(mm):2122識別出目標:person 中心點像素坐標:(414, 197) 實際坐標(mm):(506,234) 深度(mm):3268識別出目標:person 中心點像素坐標:(114, 246) 實際坐標(mm):(-930,-22) 深度(mm):2804識別出目標:chair 中心點像素坐標:(82, 340) 實際坐標(mm):(-934,-390) 深度(mm):2435識別出目標:chair 中心點像素坐標:(60, 296) 實際坐標(mm):(-1021,-216) 深度(mm):2435識別出目標:keyboard 中心點像素坐標:(456, 408) 實際坐標(mm):(199,-241) 深度(mm):892識別出目標:laptop 中心點像素坐標:(287, 303) 實際坐標(mm):(-67,-131) 深度(mm):1306識別出目標:laptop 中心點像素坐標:(354, 221) 實際坐標(mm):(77,44) 深度(mm):1332識別出目標:laptop 中心點像素坐標:(428, 257) 實際坐標(mm):(507,-73) 深度(mm):2856識別出目標:laptop 中心點像素坐標:(522, 357) 實際坐標(mm):(0,-0) 深度(mm):0return image代碼中突出了一些關鍵代碼,刪除了不必展示的代碼,源框架請參考YunYang1994/tensorflow-yolov3 Readme 翻譯。
參考文章1:Intel Realsense D435 如何獲取攝像頭的內參?get_profile() video_stream_profile() get_intrinsics()
參考文章2:Intel Realsense D435 python 從深度相機realsense生成pcl點云
參考文章3:RGB圖和Depth圖生成點云圖原理與代碼實現(realsense D435 )
參考文章4:realsense SDK2.0學習::(三)D435深度圖片對齊到彩色圖片-代碼實現
總結
以上是生活随笔為你收集整理的Intel Realsense D435 通过识别目标的像素坐标和深度值(使用内参intrinsics)获取目标点的真实坐标的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 如何取负数?直接加负号(
- 下一篇: labelImg 使用教程 图像标定工具