将像素值转换为距离

时间:2019-02-20 16:56:04

标签: orbbec

我有Orbbec相机。

我使用C#。

我为他们的SDK使用了C#包装器。

我有深度流,可以从该流中获取图像。但是,如何将像素值转换为距离(以毫米为单位)?

我环顾四周,例如Google,并且给Orbbec员工发送了电子邮件。

到目前为止,我的代码:

    private void HandleDepthFrame(
        Astra.ReaderFrame frame )
    {
        var depthFrame = frame.GetFrame<Astra.DepthFrame>();
        if ( depthBuffer.Update( depthFrame ) )
        {
            BitmapSource image = depthBuffer.ImageSource;
            dispatcher.BeginInvoke(DispatcherPriority.DataBind, new Action(() => getBitmap(image)));

            if ( frameRateCalculator.RegisterFrame() )
                RaisePropertyChanged( nameof(FramesPerSecond) );
        }
    }

    private void getBitmap(BitmapSource source)
    {

        Bitmap bmp = new Bitmap(source.PixelWidth, source.PixelHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
        BitmapData data = bmp.LockBits(new System.Drawing.Rectangle(System.Drawing.Point.Empty, bmp.Size), ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
        source.CopyPixels(Int32Rect.Empty, data.Scan0, data.Height * data.Stride, data.Stride);
        bmp.UnlockBits(data);
        Image<Gray, int16> imageCV = new Image<Gray, int16>(bmp);

??如何读取和整理垫数据到距离?         }

谢谢

1 个答案:

答案 0 :(得分:0)

我为astra使用C ++设置,并且可以通过在《指南》中提供的演示中使用一些代码来实现此目的。此处的代码:

int main(int argc, char** argv)
{

    while (window.isOpen())
    {
        astra_update();

        sf::Event event;
        while (window.pollEvent(event))
        {
            switch (event.type)
            {
                case sf::Event::MouseMoved:
                {
                    auto coordinateMapper = depthStream.coordinateMapper();
                    listener.update_mouse_position(window, coordinateMapper);
                }break;
            }
        }
    }
}

void update_mouse_position(sf::RenderWindow& window,
                           const astra::CoordinateMapper& coordinateMapper)
{
    const sf::Vector2i position = sf::Mouse::getPosition(window);
    const sf::Vector2u windowSize = window.getSize();

    float mouseNormX = position.x / float(windowSize.x);
    float mouseNormY = position.y / float(windowSize.y);

    mouseX_ = depthWidth_ * mouseNormX;
    mouseY_ = depthHeight_ * mouseNormY;

    if (mouseX_ >= depthWidth_ ||
        mouseY_ >= depthHeight_ ||
        mouseX_ < 0 ||
        mouseY_ < 0) { return; }

    const size_t index = (depthWidth_ * mouseY_ + mouseX_);
    const short z = depthData_[index];

    coordinateMapper.convert_depth_to_world(float(mouseX_),
                                            float(mouseY_),
                                            float(z),
                                            mouseWorldX_,
                                            mouseWorldY_,
                                            mouseWorldZ_);
}

因此,在此演示中,您实际上可以看到所显示的深度值,并使用此示例代码可以操纵它们达到我们的喜好。 希望这会有所帮助。