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

Привет, у меня возникли проблемы с помещением данных изображения в 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 и 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);

person SodaGuns    schedule 07.07.2014    source источник
comment
Как вы используете эти массивы imgdata и texture? Поскольку вы упоминаете OpenGL, используете ли вы их в качестве аргументов для функций OpenGL? Если да, можете ли вы показать звонки, где вы их используете? У меня есть хорошее представление о том, что, вероятно, не так, но мне нужно увидеть использование массивов.   -  person Reto Koradi    schedule 07.07.2014
comment
Да. Извините за отсутствие информации, я обновил вопрос.   -  person SodaGuns    schedule 07.07.2014
comment
Не та проблема, о которой я думал. Я думал, что вы можете использовать его как данные текстуры, так как он называется texture, но это не так. Спасибо за добавление дополнительной информации.   -  person Reto Koradi    schedule 07.07.2014
comment
Да, я использую текстуру для определения цвета точек облака точек. Итак, те for loops, они кажутся вам подходящими?   -  person SodaGuns    schedule 07.07.2014


Ответы (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] в коде отрисовки.

person Reto Koradi    schedule 07.07.2014
comment
Спасибо добрый сэр! Я уже несколько дней не могу понять эти циклы for, вы объяснили это красиво и ясно.\ - person SodaGuns; 07.07.2014
comment
Я посмотрю на проблему imgdata. - person SodaGuns; 07.07.2014
comment
что, если я изменю 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);, я все равно ничего не получу.. - person SodaGuns; 08.07.2014
comment
о, моя ошибка, я не правильно настроил перспективы. - person SodaGuns; 09.07.2014