到物体的距离 python

Distance to object python

我有一张汽车图片和一个相应的边界框。例如:

(xmin, ymin, xmax, ymax)
(504.8863220214844, 410.2454833984375, 
937.6451416015625, 723.9139404296875)

我就是这样画方框的:

def plot_results(pil_img, prob, boxes):
    plt.figure(figsize=(16,10))
    plt.imshow(pil_img)
    ax = plt.gca()
    for p, (xmin, ymin, xmax, ymax), c in zip(prob, boxes.tolist(), COLORS * 100):
        ax.add_patch(plt.Rectangle((xmin, ymin), xmax - xmin, ymax - ymin,
                                   fill=False, color=c, linewidth=3))
        cl = p.argmax()
        text = f'{CLASSES[cl]}: {p[cl]:0.2f}'
        ax.text(xmin, ymin, text, fontsize=15,
                bbox=dict(facecolor='yellow', alpha=0.5))
    plt.axis('off')
    plt.show()
    

我想测量汽车到相机的距离。如果车在附近,距离值应该在0.2-0.4左右如果车离相机很远,距离值应该在0.6-0.8左右。

我也找到了解决问题的方法:https://pythonprogramming.net/detecting-distances-self-driving-car/ 但是这里作者使用了一个旧模型。此模型效果不佳。

在评论中,您请求的代码与您提供的 link 的工作方式类似。我想说清楚你的源代码示例不是在测量距离。它仅测量车辆边界框的宽度。该逻辑基于这样的概念,即宽度越大越靠近相机,宽度越小越远离相机。由于光学错觉以及缺乏大小和比例上下文,这种方法存在许多缺陷。无论如何:

def plot_results(pil_img, prob, boxes):
    granularity = 3 # fiddle with this to scale
    img_width_inches = 16
    img_height_inches = 10 
    fig = plt.figure(figsize=(img_width_inches, img_height_inches))       
    img_width_pixels = img_width_inches * fig.dpi
    img_height_pixels = img_height_inches * fig.dpi     
    plt.imshow(pil_img)
    ax = plt.gca()
    for p, (xmin, ymin, xmax, ymax), c in zip(prob, boxes.tolist(), COLORS * 100):   
        ax.add_patch(plt.Rectangle((xmin, ymin), xmax - xmin, ymax - ymin,
                               fill=False, color=c, linewidth=3))
        cl = p.argmax()
        text = f'{CLASSES[cl]}: {p[cl]:0.2f}'
        ax.text(xmin, ymin, text, fontsize=15, bbox=dict(facecolor='yellow', alpha=0.5))
        # get width of bounding box
        box_width_pixels = xmax - xmin
        # normalize the box width with image width
        normalized_width = box_width_pixels / img_width_pixels
        # invert with 1 - apply power of granularity and round to 1 place
        apx_distance = round(((1 - (normalized_width))**granularity), 1) 
        # get middle of box in pixels     
        mid_x = (xmin + xmax) / 2
        mid_y = (ymin + ymax) / 2
        # draw value
        ax.text(mid_x, mid_y, apx_distance, fontsize=15, color="white")
        # normalize the middle x position with image width  
        mid_x_normalized = mid_x / img_width_pixels
        # create arbitrary ranges and logic to consider actionable
        if apx_distance <= 0.5:
            if mid_x_normalized > 0.3 and mid_x_normalized < 0.7:
                ax.text(50, 50, "WARNING!!!", fontsize=26, color="red")
    
    plt.axis('off')
    plt.show()

输出:

此代码与您提供的示例之间的主要区别在于,您提供的边界框值 (504.8863220214844, 410.2454833984375, 937.6451416015625, 723.9139404296875) 表示像素。但是,示例中的代码具有已根据图像大小在 0 和 1 之间标准化的边界框值。这就是为什么我以英寸和像素为单位详细定义图像的宽度和高度(也用于自解释代码)。需要它们来标准化基于像素的宽度和位置,以便它们介于 0 和 1 之间以匹配您示例中的逻辑以及您所请求的逻辑。在尝试实际测量大小和距离时,这些值也很有用。

如果您有兴趣进一步了解。我建议阅读透视法则。这是一个有趣的起点:https://www.handprint.com/HP/WCL/perspect2.html#distance