Точное расстояние от Realsense f435 по глубине с координатами x, y - PullRequest
0 голосов
/ 06 октября 2018

Я хотел бы рассчитать расстояние по глубине с помощью координат x, y обнаруженного объекта.

На изображении ниже я использовал вычитание фона в opencv, чтобы обнаружить и отследить новый объект, который вошел в вид с камер.Я могу получить координаты x, y с относительной легкостью, но у меня проблемы с получением глубины z с помощью realsense sdk.Могу ли я каким-либо образом ввести координаты x, y в realsense sdk и получить оттуда глубину z?

Я использую OpenCV Python и Realsense SDK 2 для справки.

Получение глубины z в средней точке ограничительной рамки

import numpy as np
import cv2 as cv
import pyrealsense2 as rs

# Create a pipeline
pipeline = rs.pipeline()
config = rs.config()
config.enable_stream(rs.stream.depth, 1280, 720, rs.format.z16, 30)
config.enable_stream(rs.stream.color, 1280, 720, rs.format.bgr8, 30)

#Start pipeline
profile = pipeline.start(config)

erodeKernel = cv.getStructuringElement(cv.MORPH_RECT, (5,5))

fgbg = cv.createBackgroundSubtractorMOG2()
while True:
    frames = pipeline.wait_for_frames()
    depth_frame = frames.get_depth_frame()
    colour_frame = frames.get_color_frame()

    color_image = np.asanyarray(colour_frame.get_data())
    depth_image = np.asanyarray(depth_frame.get_data())

    # Apply colormap on depth image (image must be converted to 8-bit per pixel first)
    depth_colormap = cv.applyColorMap(cv.convertScaleAbs(depth_image, alpha=0.03), cv.COLORMAP_JET)

    blur = cv.GaussianBlur(color_image,(5,5),0)
    fgmask = fgbg.apply(blur)

    im2, contours, hierarchy = cv.findContours(fgmask.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
    for c in contours:
        if cv.contourArea(c) < 200:
            continue

        (x,y,w,h) = cv.boundingRect(c)
        cv.rectangle(color_image, (x,y), (x + w, y + h), (0,255,0), 2)

    cv.imshow('RealSense', color_image)
    cv.imshow("Depth", depth_colormap)
    cv.imshow('Mask', fgmask)
    if cv.waitKey(25) == ord('q'):
        break
cv.destroyAllWindows()
pipeline.stop()

1 Ответ

0 голосов
/ 06 октября 2018

Похоже, это довольно простое решение.После изучения примеров c ++, realsense sdk предоставляет функцию, известную как get_distance (x, y), где она будет возвращать расстояние глубины в соответствии с координатами x, y.

Обратите внимание, что эта функция в python точно такая же, но должна вызываться из рамки глубины, а x и y должны быть преобразованы в целое число

pipeline = rs.pipeline()
config = rs.config()
profile = pipeline.start(config)
frames = pipeline.wait_for_frames()
    while True:
        depth_frame = frames.get_depth_frame()
        zDepth = depth_frame.get_distance(int(x),int(y))
...