проблемы с работой с изображениями и значениями пикселей в С++

У меня есть 9 фотографий человека, но он стоит в разных местах на каждой из 9 фотографий. Первый вложенный цикл for создает тройной массив, где j=picture, а x и y представляют координаты пикселей в каждом изображении. Я использую функцию getpixel, чтобы сохранить их в этом тройном цикле. Моя проблема заключается во втором вложенном цикле for. Я создаю массивы для значений rgb каждого пикселя, а затем сортирую их пузырьком, чтобы найти среднее значение. Теоретически это должно вернуть изображение, на котором мужчина исчез, а остался только фон фотографии. Однако он не работает и по-прежнему отображает изображение с мужчиной внутри. Что я делаю неправильно?

  #include <iostream>
   #include <stdlib.h>
   #include <cmath>
   #include <ctime>
   #include <graphics.h>
   #include <stdio.h>

   using namespace std;

void loadImage(int imageNumber);
void bubbleSort(arr[], int n);

int main()
{
    //triple array to work with all 9 pics
    int picture[9][200][225];

    int redArray[9];
    int greenArray[9];
    int blueArray[9];

    //size of the 3 arrays to be used in bubble sort
    int n1=sizeof(redArray);
    int n2=sizeof(greenArray);
    int n3=sizeof(blueArray);

    //window that displays the picture
    initwindow(600, 625, "tourist");


    //stores the pixel value for all 9 pictures
    for(int j=0; j<9; j++)
    {
        loadImage(j);
        {
            for(int x=0; x<200; x++)
            {
                for(int y=0; y<225; y++)
                {   
                    picture[j][x][y]=getpixel(x, y);
                }   
            }
        }
    }

    //sets the rgb values of all the pixels of all the pictures  and bubble sorts them
    //using the median value of 9 elements(4th value) to remove the person from the picture
    for(int x=0; x<200; x++)
    {
        for(int y=0; y<225; y++)
        {
            for(int j=0; j<9; j++)
            {


                redArray[j]=RED_VALUE(picture[j][x][y]);
                greenArray[j]=GREEN_VALUE(picture[j][x][y]);
                blueArray[j]=BLUE_VALUE(picture[j][x][y]);
            }


            bubbleSort(redArray[], n1);
            bubbleSort(greenArray[], n2);
            bubbleSort(blueArray[], n3);

            //putpixel redarray[4]
            putpixel(x,y,Color(redArray[4], greenArray[4], blueArray[4]);

        }   
    }

    getch();    
}

//this is a BGI function that loads the image onto the current window
void loadImage(int imageNumber)
{
     char str[5];
     sprintf(str, "%i.jpg", imageNumber);
     readimagefile(str,0,0,200,225); 
}

void bubbleSort(int arr[], int n)
{
    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < n - i - 1; ++j)
        {
            if (arr[j] > arr[j + 1])
            {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }   


    }  

}   

person Dan    schedule 14.04.2016    source источник
comment
Вы не можете использовать std::sort?   -  person user2475059    schedule 15.04.2016
comment
Кроме того, вы можете показать ввод и вывод?   -  person user2475059    schedule 15.04.2016
comment
sprintf добавляет нулевой символ; Я думаю, вам нужно char str[6];.   -  person user2475059    schedule 15.04.2016
comment
Подождите... Он все еще отображает изображение с мужчиной на нем? У вас есть девять фотографий с мужчиной, какая из них отображается?   -  person Beta    schedule 15.04.2016
comment
- нет, это должна быть пузырьковая сортировка   -  person Dan    schedule 15.04.2016
comment
- он перебирает все 9 изображений, а не сидит на последнем   -  person Dan    schedule 15.04.2016
comment
Что вам говорит отладчик?   -  person user2475059    schedule 15.04.2016
comment
есть проблемы с передачей arr[] и int n в функцию пузырьковой сортировки, а также цвет, не объявленный в строке putpixel   -  person Dan    schedule 15.04.2016


Ответы (1)


Эта линия

int n1=sizeof(redArray);

устанавливает n1 равным 9 целым числам, что, вероятно, равно 36 (в зависимости от архитектуры вашей машины)

Затем вы используете это как входные данные для своей пузырьковой сортировки, что означает, что ваша пузырьковая сортировка выходит за границы массива. Это поведение undefined и может привести к тому, что значения в массивах будут неверными.

Измените строки на

int n1=sizeof(redArray) / sizeof (redArray[0]);

или даже просто используйте 9, поскольку он есть и в нескольких других местах (возможно, вы могли бы определить const int как 9, чтобы вы могли легко изменить его позже.

person The Dark    schedule 14.04.2016