/// <summary> /// returns the centre of the square cell /// </summary> /// <param name="centre_x">x centre position</param> /// <param name="centre_y">y centre position</param> public void GetCentre(ref float centre_x, ref float centre_y) { if (perimeter != null) { perimeter.GetSquareCentre(ref centre_x, ref centre_y); } }
/// <summary> /// locates the centre position of a spot /// </summary> /// <param name="raw_image_mono">mono image data</param> /// <param name="raw_image_width">image width</param> /// <param name="raw_image_height">image height</param> /// <param name="search_region">region within which to search</param> /// <param name="black_on_white">whether this image contains dark markings on a lighter background</param> /// <param name="centre_x">returned x centre position</param> /// <param name="centre_y">returned y centre position</param> private static unsafe void LocateSpotCentre(byte* raw_image_mono, int raw_image_width, int raw_image_height, polygon2D search_region, bool black_on_white, ref float centre_x, ref float centre_y) { centre_x = 0; centre_y = 0; // get dimensions of the region to be searched int tx = (int)search_region.left(); //int ty = (int)search_region.top(); int bx = (int)search_region.right(); //int by = (int)search_region.bottom(); int r = (bx - tx) / 3; if (r < 1) r = 1; int search_r = (bx - tx) / 4; if (search_r < 1) search_r = 1; // centre of the search region float search_centre_x = 0; float search_centre_y = 0; search_region.GetSquareCentre(ref search_centre_x, ref search_centre_y); //search_region.getCentreOfGravity(ref search_centre_x, ref search_centre_y); int image_pixels = raw_image_width * raw_image_height; float max = 0; float v; for (float offset_y = search_centre_y - search_r; offset_y <= search_centre_y + search_r; offset_y += 0.5f) { for (float offset_x = search_centre_x - search_r; offset_x <= search_centre_x + search_r; offset_x += 0.5f) { float tot = 0; for (int yy = (int)(offset_y - r); yy <= (int)(offset_y + r); yy += 2) { int n0 = yy * raw_image_width; for (int xx = (int)(offset_x - r); xx <= (int)(offset_x + r); xx += 2) { int n1 = n0 + xx; if ((n1 > -1) && (n1 < image_pixels)) { if (black_on_white) v = 255 - raw_image_mono[n1]; else v = raw_image_mono[n1]; tot += v * v; } } } if (tot > max) { max = tot; centre_x = offset_x; centre_y = offset_y; } } } }
/// <summary> /// locates the centre position of a spot /// </summary> /// <param name="raw_image_mono">mono image data</param> /// <param name="raw_image_width">image width</param> /// <param name="raw_image_height">image height</param> /// <param name="search_region">region within which to search</param> /// <param name="black_on_white">whether this image contains dark markings on a lighter background</param> /// <param name="centre_x">returned x centre position</param> /// <param name="centre_y">returned y centre position</param> private static unsafe void LocateSpotCentre(byte *raw_image_mono, int raw_image_width, int raw_image_height, polygon2D search_region, bool black_on_white, ref float centre_x, ref float centre_y) { centre_x = 0; centre_y = 0; // get dimensions of the region to be searched int tx = (int)search_region.left(); //int ty = (int)search_region.top(); int bx = (int)search_region.right(); //int by = (int)search_region.bottom(); int r = (bx - tx) / 3; if (r < 1) { r = 1; } int search_r = (bx - tx) / 4; if (search_r < 1) { search_r = 1; } // centre of the search region float search_centre_x = 0; float search_centre_y = 0; search_region.GetSquareCentre(ref search_centre_x, ref search_centre_y); //search_region.getCentreOfGravity(ref search_centre_x, ref search_centre_y); int image_pixels = raw_image_width * raw_image_height; float max = 0; float v; for (float offset_y = search_centre_y - search_r; offset_y <= search_centre_y + search_r; offset_y += 0.5f) { for (float offset_x = search_centre_x - search_r; offset_x <= search_centre_x + search_r; offset_x += 0.5f) { float tot = 0; for (int yy = (int)(offset_y - r); yy <= (int)(offset_y + r); yy += 2) { int n0 = yy * raw_image_width; for (int xx = (int)(offset_x - r); xx <= (int)(offset_x + r); xx += 2) { int n1 = n0 + xx; if ((n1 > -1) && (n1 < image_pixels)) { if (black_on_white) { v = 255 - raw_image_mono[n1]; } else { v = raw_image_mono[n1]; } tot += v * v; } } } if (tot > max) { max = tot; centre_x = offset_x; centre_y = offset_y; } } } }