当前位置:   article > 正文

Ubutntu下使用realsense d435i(三):使用yolo v5测量目标物中心点三维坐标_yolov5返回检测图像的中心点坐标

yolov5返回检测图像的中心点坐标

01 参考

本文下述使用参考的的工程均来自于下面的两个github

我的文件是在yolov5-D435i工程基础上改的,yolov5-D435i是在yolov5工程基础上改的。


02 分析

  • 关于yolo部分

    https://github.com/ultralytics/yolov5 这是一个比较经典的yolo v5的代码,它提供了一些接口,在README.md中进行了介绍。
    可以看到只要在自己写的文件里创建model就可以调用这个结果了。

    import torch
    # Model
    model = torch.hub.load('ultralytics/yolov5', 'yolov5s')  # or yolov5m, yolov5l, yolov5x, custom
    
    # Images
    img = 'https://ultralytics.com/images/zidane.jpg'  # or file, Path, PIL, OpenCV, numpy, list
    
    # Inference
    results = model(img)
    
    # Results
    results.print()  # or .show(), .save(), .crop(), .pandas(), etc.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

  • 关于获取三维坐标的部分

    https://github.com/killnice/yolov5-D435imain_debug.py文件的深度获取方法
    —— 是在中心点附近取一些随机点,然后深度排序取中值滤波。(这些被随机选择到的中心点,在图中画了蓝色小圆圈标记这些点)
    猜测这样做是可以避免realsense获取深度过程中,某点的忽然转换失效,认为深度值为0,如果取周围几个点进行获取深度,并中值滤波,将大大提高这个深度值在测量过程中的稳定性,避免了realsense忽然某帧某点的深度值为0的情况

    我要获得中心点的坐标,可以参考Ubutntu下使用realsense d435i(二):获取某二维像素点的三维坐标
    —— 修改get_mid_pos()函数,根据中心点的坐标以及中心点对应的深度获取中心点的三维坐标。
    但是这样做也面临一个问题,就是上面提到的,仅仅测量中心点的深度,当忽然这个深度值为0,他的三维坐标转换就会出错,如果把这个值设为机械臂的目标点,就会导致机械臂一瞬间点的位置出错。
    把realsense相机画面的频率降低会对这个现象改善一点,但还是存在,所以考虑可以参考上述深度值得解决办法,也获取周围点,做一个中值滤波
    另外就是考虑相机还没有标定,参考realsense d435相机标定,现在确实照墙壁时深度图像有很多“黑洞”,这有可能也是忽然深度值为0的原因。

    未来要修改的地方
    —— ① 把【像素x,像素y,深度值z】进行一个数据结构的保存(是选择元祖、数组还是什么结构还没有想好)
    ② 利用随机数获取周边的一些点,同样获得这些点的【像素x,像素y,深度值z】
    ③ 把所有点根据深度值z进行排序和中值滤波,选择排序中间的那一个点,根据深度值以及与其对应的像素x,y,获得该点的三维坐标,并以此为目标物的三维坐标。


  • 关于文件结构部分

    由于yolo的测试程序以及对外开放了接口,所以我们只需要在原来的YOLO v5中(https://github.com/ultralytics/yolov5),再创建一个my_realsense_detect.py程序(不需要替换原来的detect.py程序),就可以了。
    也就是说,把my_realsense_detect.py程序放到最开始提到的2个github程序中都可以运行。如果想放到其他的yolo程序,需要看看他具体提到的模型接口结果接口都是什么。

03 代码

首先我下载了https://github.com/killnice/yolov5-D435i

我的文件是在yolov5-D435i工程基础上改的,yolov5-D435i是在yolov5工程基础上改的。

git clone https://github.com/killnice/yolov5-D435i.git realsense435_yolo

cd realsense435_yolo

open_anaconda

torch

pip install -r requirements.txt

pip install pyrealsense2

python main_debug.py
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

然后是在main_debug.py文件的基础上进行了修改,并把它重命名为了my_realsense_detect.py

说明:
 
yolov5-D435i工程中的main.pymain_debug.pytry.py都是可以删除的,只要运行my_realsense_detect.py就可以
 
在yolov5工程中,只要把my_realsense_detect.py文件复制进去就也可以运行啦


接下来是我的代码,只放上了核心部分,具体可以根据yolov5-D435i工程中的main_debug.py文件进行修改。

def get_mid_pos(aligned_depth_frame,box):
    mid_pixel = [(box[0] + box[2])//2, (box[1] + box[3])//2] #确定索引深度的中心像素位置
    # 注意mid_pixel是float,但是get_distance()的参数需要是int
    [x, y] = [int(mid_pixel[0]), int(mid_pixel[1])]
    depth_intrin = aligned_depth_frame.profile.as_video_stream_profile().intrinsics # 获取相机深度参数
    dis = aligned_depth_frame.get_distance(x, y)        # 获取该像素点对应的深度
    # print ('depth: ',dis)       # 深度单位是m
    camera_coordinate = rs.rs2_deproject_pixel_to_point(depth_intrin, [x, y], dis)
    # print ('camera_coordinate: ',camera_coordinate)
    return camera_coordinate

    
def dectshow(org_img, boxs,aligned_depth_frame):
    img = org_img.copy()
    for box in boxs:
        cv2.rectangle(img, (int(box[0]), int(box[1])), (int(box[2]), int(box[3])), (0, 255, 0), 2)
        point_3d = dist = get_mid_pos(aligned_depth_frame,box)
        [x, y, z] = point_3d
        # cv.putText 图片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细
        cv2.putText(img, box[-1] + ' (' + str(x)[:4] + ',' + str(y)[:4] + ',' + str(z)[:4] + ')',
                    (int(box[0]), int(box[1])), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255, 255, 255), 1)
    cv2.imshow('dect_img', img)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

这个程序需要说明的是像素坐标的中点是float形式,而get_distance(x, y)函数的参数是int形式,需要进行强制转换。

04 待解决的问题

  • 中值滤波或标定等
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/250770
推荐阅读
相关标签
  

闽ICP备14008679号