I am trying to make a code that detects sudoku grids. This means that I have to apply lots of filters on the image and then apply the Hough Transform algorithm on it following the output of Sobel algorithm (which makes the edges appear as white pixels on a black image).
I somewhat understand its concept and why it is important to use "Rho = xcos(Theta) + ysin(Theta)" to obtain the edges coordinates in a parameter space.
However, I'm having issues with Rho and my accumulator array. Here is my code so far:
void hough(SDL_Surface* image_surface)
{
unsigned int width = image_surface->w;
unsigned int height = image_surface->h;
unsigned int Rhos, Thetas;
Rhos = sqrt(width * width + height * height);
Thetas = 180;
//initialise accumulator array
unsigned int acc_array[Rhos][Thetas];
for (size_t i = 0; i < Rhos; i++)
{
for (size_t j = 0; j < Thetas; j++)
acc_array[i][j] = 0;
}
Uint32 pixel;
Uint8 r, g, b;
//go through each pixels
for (size_t x = 0; x < width; x++)
{
for (size_t y = 0; y < height; y++)
{
pixel = get_pixel(image_surface, x, y);
SDL_GetRGB(pixel, image_surface->format, &r, &g, &b);
//if white
if (r+g+b == 765)
{
//p = x*cos(t) + y*sin(t)
//check for every t
for (int t = 0; t < 180;t++)
{
unsigned int p = x*cos(t) + y*sin(t);
acc_array[p][t]++;
}
}
}
}
//rest of the code below...
My problem is that when, for example, I am on the pixel (20, 1882) of the image and my theta (or t) = 4, p (or Rho) becomes -1437. If Rho is negative, then I cannot increment its place in the accumulator array since an index cannot be negative.
Can anyone help me out with this? I would appreciate all the help I can get.
SDL_Surface
, input values, expected outputs, etc. Please edit to include a scaled down usage example, that is compileable, that also causes the problem to occur. ( minimal reproducible example ) – ryyker