Проблема с помещением изображения в массив при выполнении облака точек

#arrays #opengl #for-loop #point-clouds

#массивы #opengl #for-цикл #облака точек

Вопрос:

Привет, у меня возникли проблемы с помещением данных изображения в 3D-массивы при выполнении облака точек с opengl.

Это мои два 3D-массива:

 float*** imgdata;
    imgdata = new float**[576];
    for(int a=0; a<576; a  )
    {
        *(imgdata   a) = new float*[352];
        for(int b=0; b<352; b  )
            *(*(imgdata   a)   b) = new float[1];
    }

float*** texture;
texture = new float**[576];
for(int a=0; a<576; a  )
{
    *(texture   a) = new float*[352];
    for(int b=0; b<352; b  )
        *(*(texture   a)   b) = new float[3];
}
  

и именно здесь я загружаю карту глубины и цветное изображение

 GBmp bm0;
GBmp bm1;
bm0.load("depth.bmp");
bm1.load("color.bmp");
  

теперь я пытаюсь поместить данные двух изображений в 3D-массивы, используя циклы for
похоже, проблема заключается именно в этой части.

 for (int i=0; i<bm0.w; i  )
{
    for (int j=0; j<bm0.h; j  )
    {
        for (int x=0; x<bm0.w; x  )
        { 
            for (int y=0; y<bm0.h; y  )
            {
                texture[i][j][0] = bm1.rgb[x*3 y*bm0.w*3];
                texture[i][j][1] = bm1.rgb[x*3 y*bm0.w*3 1];
                texture[i][j][2] = bm1.rgb[x*3 y*bm0.w*3 2];
            }
        }
    }
}

for (int i=0; i<bm0.w; i  )
{
    for (int j=0; j<bm0.h; j  )
    {
        for (int x=0; x<bm0.w; x  )
        { 
            for (int y=0; y<bm0.h; y  )
            {
                imgdata[i][j][0] = bm0.rgb[x y*bm0.w];
            }
        }
    }
}
  

Когда я начинаю отладку, я получаю только пустое окно без каких-либо ошибок или необработанного исключения, поэтому я понятия не имею, что пошло не так. Любая помощь или совет приветствуются.

Вот вторая половина кода. Я использую эти два массива, imgdata amp; texture, для рисования точек в трехмерном пространстве.

 glPointSize (1);
    glBegin(GL_POINTS);
    for (int i=0; i<bm0.w; i  )
        {
            for (int j=0; j<bm0.h; j  )
            {
                glColor3f(texture[i][j][0]/255, texture[i][j][1]/255, texture[i][j][2]/255);
                x=imgdata[i][j][0];
                y=imgdata[i][j][1];   
                z=imgdata[i][j][2];   
                glVertex3f(x,y,z);    
            }
        }
    glEnd(); 
glutSwapBuffers();

free(imgdata);
free(texture);
  

Комментарии:

1. Как вы используете эти imgdata и texture массивы? Поскольку вы упомянули OpenGL, используете ли вы их в качестве аргументов для функций OpenGL? Если да, можете ли вы показать вызовы, в которых вы их используете? У меня есть хорошая идея о том, что, вероятно, неправильно, но мне нужно увидеть использование массивов.

2. Да, это так. Извините за отсутствие информации, я обновил вопрос.

3. Не та проблема, о которой я думал, что это может быть. Я подумал, что вы, возможно, используете его в качестве текстурных данных с момента его вызова texture , но это не так. Спасибо за добавление дополнительной информации.

4. Да, я использую «текстуру» для определения цвета точек облака точек. Итак, эти циклы for, они кажутся вам нормальными?

Ответ №1:

Ваша логика цикла выглядит некорректно. Внимательно посмотрите на то, что здесь происходит:

 for (int i=0; i<bm0.w; i  )
{
    for (int j=0; j<bm0.h; j  )
    {
        for (int x=0; x<bm0.w; x  )
        { 
            for (int y=0; y<bm0.h; y  )
            {
                texture[i][j][0] = bm1.rgb[x*3 y*bm0.w*3];
                texture[i][j][1] = bm1.rgb[x*3 y*bm0.w*3 1];
                texture[i][j][2] = bm1.rgb[x*3 y*bm0.w*3 2];
            }
        }
    }
}
  

Похоже, вы хотите в значительной степени просто скопировать данные в массивы, которые вы выделили своим собственным расположением памяти. Два внешних цикла повторяют каждый пиксель в вашем целевом массиве ( texture ). Как только вы окажетесь внутри этих двух циклов, я полагаю, вы просто захотите скопировать соответствующий пиксель из исходного массива. Вместо этого у вас есть еще два цикла, которые повторяют каждый пиксель в исходном массиве.

Таким образом, вы перезаписываете texture[i][j] с каждой итерацией двух внутренних циклов. Результатом этого является то, что все пиксели в целевом массиве будут иметь одинаковое значение, которое является последним пикселем в исходном массиве.

Вместо этого вам нужно что-то вроде этого:

 for (int i=0; i<bm0.w; i  )
{
    for (int j=0; j<bm0.h; j  )
    {
        texture[i][j][0] = bm1.rgb[i*3 j*bm0.w*3];
        texture[i][j][1] = bm1.rgb[i*3 j*bm0.w*3 1];
        texture[i][j][2] = bm1.rgb[i*3 j*bm0.w*3 2];
    }
}
  

Это просто перебирает все пиксели и копирует их из источника в пункт назначения.

Другая проблема заключается в том, что вы выделяете и заполняете imgdata с [1] для последнего измерения, но затем получаете к нему доступ с помощью индексов [0] , [1] и [2] в коде рисования.

Комментарии:

1. Спасибо, добрый сэр! Я не могу разобраться в этих циклах for в течение нескольких дней, вы объяснили это красиво и ясно.

2. Я разберусь с imgdata проблемой.

3. что, если я изменил imgdata на float** imgdata; imgdata = new float*[576]; for(int a=0; a<576; a ) { *(imgdata a) = new float[352]; } , а затем часть для определения местоположения точек на x=imgdata[i][j]; y=imgdata[i][j]; z=imgdata[i][j]; glVertex3f(x,y,z); , хотя я по-прежнему ничего не получаю..

4. о, моя ошибка, я неправильно настроил перспективы.