【问题标题】:Reading a kinect depth file in C++在 C++ 中读取 kinect 深度文件
【发布时间】:2015-02-17 20:29:07
【问题描述】:

要读取一帧的深度数据,必须跳过深度文件的前 28 个字节,其余是 320*240 无符号短的数组,即 320*240*2 字节(因为每个深度帧有 320 x 240 像素)。我已经包含了用于读取深度文件的代码,但是当我尝试运行它时它总是挂起。请告诉我如何更正代码。

int main()
{
    int array_size = 76800*2;
    char *data[array_size];
    unsigned short depth[320][240];
    int i,j;
    // open the depth file in read mode.
    ifstream infile("000000.depth");
    // check for error in opening file
    if(!infile.is_open())
    {
        std::cout<< "File could not be opened";
        return 1;
    }

    std::cout << "Reading from the file" << endl;
    infile.seekg(29,ios::beg); // discarding first 28 bytes

    while(!infile.eof())
    {
        infile >> data[array_size];
    }
    // storing data in required array
    for (i=0; i = 320; i++)
    {
        for (j=0; j=240; j++)
        {
            depth[i][j] = (unsigned short)atof(data[i*j]);
            std::cout << depth[i][j] << endl;
        }
    }

    infile.close();
    getch();
    return(0);
}

【问题讨论】:

  • while(eof)读取是错误的,没有以二进制模式打开文件,for循环使用赋值而不是比较,你为char*分配空间而不是为char分配空间。跨度>
  • 如果您提供000000.depth文件内容的示例(前60个字节,只是为了查看格式),我会很好

标签: c++ file computer-vision kinect


【解决方案1】:

嗯,for 循环似乎有问题。正在看:

 for (i=0; i = 320; i++)

这意味着“运行循环,i 从 0 开始,只要 i = 320 为真”。问题是 i = 320 评估为 320 作为一个值,这始终是正确的。你想要i &lt; 320

【讨论】:

    【解决方案2】:

    我认为问题在于您分配char * data[array_size] 的位置,尝试char data[array_size],因为您分配的是指针数组大小而不是内存块。你的for循环也应该是

    for(i=0;i<320;i++)
      for(j=0;j<320;j++)
       { 
            //do your stuff here
    
           }
    

    【讨论】:

      【解决方案3】:

      我想你的文件不能是文本文件,所以尝试以二进制模式打开文件,即更改

       ifstream infile("000000.depth");
      

       ifstream infile("000000.depth", std::ios::binary);
      

      并使用infile.read() 而不是infile &gt;&gt; 来读取数据。

      编辑:

      我还有一个问题:读取数据到数组data,看起来像

      while(!infile.eof())
      {
          infile >> data[array_size];
      }
      

      应该读取char 类型或char *(C 样式字符串)的元素吗?

      检查声明中data 的类型(我猜它必须是char data[array_size];)并考虑从文件中读取

       infile.get (data,array_size);
      

      编辑 2:

      正如user3589654和Vincent Fourmond所说,你在循环for中有错误的条件,但也要转换

       depth[i][j] = (unsigned short)atof(data[i*j]);
      

      是问题的潜在根源:

      1) atof 转换为 float 但不转换为 int 也不转换为 unsigned short

      2) 表达式data[i*j] 将从错误的内存部分获取数据,我想你想要data[i*240 + j](或类似的东西)

      3)如果您的文件不是文本文件,其中数字存储为空格分隔的 ASCII 符号序列,那么这种读取和转换的方法是绝对不合适的

      【讨论】:

        【解决方案4】:

        感谢大家的投入。我已经完全改变了我的代码,它现在可以工作了。我用 C 而不是 C++ 编写了它。

        如前所述,基本错误出现在 for 循环中。 while 循环也是错误的来源,没有必要先在 char 中读取它,然后将其转换为 unsigned short。新代码如下所述;

        #include<stdio.h>
        #include<stdlib.h>
        #include<conio.h>
        using namespace std;
        
        int main()
        {
        unsigned short depth[320][240],x;
        int i,j;
        
        FILE *infile = fopen("000000.depth","rb");
        fseek(infile, 29, SEEK_SET);
        printf("Reading data from depth file");
        
        for (i=0; i < 320; i++)
        {
            for (j=0; j<240; j++)
        {
                fread(&x, sizeof x, 1, infile);
                depth[i][j] = x;
                printf("\n%d %d",depth[i][j],x);
        }
        }
        
        fclose(infile);
        getch();
        return(0);
        }
        

        【讨论】:

        • 我也会切换尺寸:depth[240][320], i
        • 是的,你是对的。我已经切换了尺寸。你怎么知道它们必须被转换?
        • 这是存储/读取图像的常用方法:很少看到它以相反的方式存储。所以,你可以说这是一个幸运的猜测:)
        猜你喜欢
        • 2021-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-28
        • 2016-12-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多