Cześć wszystkim. W krótkim programie z przetwarzania obrazu korzystam z algorytmu floodfill w celu pozbycia się jasnego tła, zostawiając elementy główne. Wszystko działa w porządku, przy czym jest jeden problem. Korzystam z funkcji algorytmu ze strony http://lodev.org/cgtutor/floodfill.html
#define stackSize 16777216
int stack[stackSize];
int stackPointer;
bool pop(int& x, int& y)
{
if(stackPointer > 0)
{
int p = stack[stackPointer];
x = p / h;
y = p % h;
stackPointer--;
return 1;
}
else
{
return 0;
}
}
bool push(int x, int y)
{
if(stackPointer < stackSize - 1)
{
stackPointer++;
stack[stackPointer] = h * x + y;
return 1;
}
else
{
return 0;
}
}
void emptyStack()
{
int x, y;
while(pop(x, y));
}
void floodFill4Stack(int x, int y, int newColor, int oldColor)
{
if(newColor == oldColor) return; //avoid infinite loop
emptyStack();
static const int dx[4] = {0, 1, 0, -1}; // relative neighbor x coordinates
static const int dy[4] = {-1, 0, 1, 0}; // relative neighbor y coordinates
if(!push(x, y)) return;
while(pop(x, y))
{
screenBuffer[y][x] = newColor;
for(int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if(nx > 0 && nx < w && ny > 0 && ny < h && screenBuffer[ny][nx] == oldColor) {
if(!push(nx, ny)) return; //h i w to wymiary obrazka
}
}
}
}
Problem jest taki, że algorytm działa na obrazku o wymiarach kwadratu, ja natomiast korzystam z obrazka o wymiarach 600x800 i po wykonaniu algorytmu zostaje 200 pikseli białego prostokąta na dole. Wie ktoś, w jaki sposób rozwiązać ten problem?
Z góry dzięki,
Pozdrawiam
h
jest źle ustawiona na 400 zamiast na 600.