opencv - 如何将TangoXyxIjData转换为z值矩阵

标签 opencv google-project-tango

我目前正在使用Project Tango平板电脑来避免机器人避障。我想创建一个z值矩阵,就像它们出现在Tango屏幕上一样,以便可以使用OpenCV处理该矩阵。当我说z值时,我的意思是每个点到探戈的距离。但是,我不知道如何从TangoXyzIjData中提取z值并将这些值组织到一个矩阵中。这是我到目前为止的代码:

    public void action(TangoPoseData poseData, TangoXyzIjData depthData) {
    byte[] buffer = new byte[depthData.xyzCount * 3 * 4];
    FileInputStream fileStream = new FileInputStream(
            depthData.xyzParcelFileDescriptor.getFileDescriptor());
    try {
        fileStream.read(buffer, depthData.xyzParcelFileDescriptorOffset, buffer.length);
        fileStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

    Mat m = new Mat(depthData.ijRows, depthData.ijCols, CvType.CV_8UC1);
    m.put(0, 0, buffer);
}

有谁知道如何做到这一点?我非常感谢您的帮助。

最佳答案

简短的答案是它无法做到,至少不是简单的。 Tango API中的XYZij结构尚未完全起作用。没有“ij”数据。您对缓冲区的检索将按照编码的方式进行。内容是一组用于测量深度点的X,Y,Z值,每个回调大约10000+。每个X,Y和Z值都是float类型,因此不是CV_8UC1。问题在于这些点没有以任何方式排序,因此它们不对应于“图像”或xy栅格。它们是深度点的随机列表。有多种方法可以使它们按xy顺序排列,但这并不简单。我都做了这两个:

  • 将其渲染为图像,深度编码为颜色,然后将图像拉出为像素
  • 使用来自OpenGL的模型/ View /透 View ,将每个点的位置相乘,然后找出它们的屏幕空间位置(就像OpenGL在渲染过程中一样)。按点的xy屏幕空间排序。而不是计算出的屏幕空间深度,只需保留原始缓冲区的Z值即可。

  • 要么
  • 等到(如果)固定XYZij结构,以便返回ij值。
  • 关于opencv - 如何将TangoXyxIjData转换为z值矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29524129/

    相关文章:

    opencv - 使用 Opencv 进行 Python 多线程视频处理 - 停止视频后 setMouseCallback 不起作用

    android - 在 Android 上使用 JNI 使用上下文指针调用函数会导致段错误

    opencv - opencv中cvtColor函数失败

    opencv - 函数 'cv::resize' OpenCV 中的错误 : (-215:Assertion failed) ! ssize.empty()

    c# - 如何在带有 VB.net GUI 的 C++ OpenCV 项目中使用 C# 库?

    android - TangoService_connectOnFrameAvailable() 使用 Google Tango Leibniz Release 1.10 卡住或崩溃

    algorithm - 点看点

    opencv - 如何使用OpenCV查找从摄像机到对象/标记的距离和旋转?

    android - 如何导出点云数据(Project Tango)?

    java - Project Tango 开发环境 (java) 问题