├── README ├── LICENSE ├── fast.h ├── fast.c ├── nonmax.c └── fast_12.c /README: -------------------------------------------------------------------------------- 1 | FAST feature detectors in C Version 2.0 2 | --------------------------------------- 3 | 4 | The files are valid C and C++ code, and have no special requirements for 5 | compiling, and they do not depend on any libraries. Just compile them along with 6 | the rest of your project. 7 | 8 | To use the functions, #include "fast.h" 9 | 10 | The corner detectors have the following prototype (where X is 9, 10, 11 or 12): 11 | 12 | xy* fastX_detect_nonmax(const unsigned char * data, int xsize, int ysize, int stride, int threshold, int* numcorners) 13 | 14 | Where xy is the following simple struct typedef: 15 | 16 | typedef struct 17 | { 18 | int x, y; 19 | } xy; 20 | 21 | The image is passed in as a block of data and dimensions, and the list of 22 | corners is returned as an array of xy structs, and an integer (numcorners) 23 | with the number of corners returned. The data can be deallocated with free(). 24 | Nonmaximal suppression is performed on the corners. Note that the stride 25 | is the number of bytes between rows. If your image has no padding, then this 26 | is the same as xsize. 27 | 28 | The detection, scoring and nonmaximal suppression are available as individual 29 | functions. To see how to use the individual functions, see fast.c 30 | 31 | 32 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2006, 2008 Edward Rosten 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions 6 | are met: 7 | 8 | 9 | *Redistributions of source code must retain the above copyright 10 | notice, this list of conditions and the following disclaimer. 11 | 12 | *Redistributions in binary form must reproduce the above copyright 13 | notice, this list of conditions and the following disclaimer in the 14 | documentation and/or other materials provided with the distribution. 15 | 16 | *Neither the name of the University of Cambridge nor the names of 17 | its contributors may be used to endorse or promote products derived 18 | from this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23 | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 24 | CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 25 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 26 | PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 27 | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 28 | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 29 | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 30 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 | -------------------------------------------------------------------------------- /fast.h: -------------------------------------------------------------------------------- 1 | #ifndef FAST_H 2 | #define FAST_H 3 | 4 | typedef struct { int x, y; } xy; 5 | typedef unsigned char byte; 6 | 7 | int fast9_corner_score(const byte* p, const int pixel[], int bstart); 8 | int fast10_corner_score(const byte* p, const int pixel[], int bstart); 9 | int fast11_corner_score(const byte* p, const int pixel[], int bstart); 10 | int fast12_corner_score(const byte* p, const int pixel[], int bstart); 11 | 12 | xy* fast9_detect(const byte* im, int xsize, int ysize, int stride, int b, int* ret_num_corners); 13 | xy* fast10_detect(const byte* im, int xsize, int ysize, int stride, int b, int* ret_num_corners); 14 | xy* fast11_detect(const byte* im, int xsize, int ysize, int stride, int b, int* ret_num_corners); 15 | xy* fast12_detect(const byte* im, int xsize, int ysize, int stride, int b, int* ret_num_corners); 16 | 17 | int* fast9_score(const byte* i, int stride, xy* corners, int num_corners, int b); 18 | int* fast10_score(const byte* i, int stride, xy* corners, int num_corners, int b); 19 | int* fast11_score(const byte* i, int stride, xy* corners, int num_corners, int b); 20 | int* fast12_score(const byte* i, int stride, xy* corners, int num_corners, int b); 21 | 22 | 23 | xy* fast9_detect_nonmax(const byte* im, int xsize, int ysize, int stride, int b, int* ret_num_corners); 24 | xy* fast10_detect_nonmax(const byte* im, int xsize, int ysize, int stride, int b, int* ret_num_corners); 25 | xy* fast11_detect_nonmax(const byte* im, int xsize, int ysize, int stride, int b, int* ret_num_corners); 26 | xy* fast12_detect_nonmax(const byte* im, int xsize, int ysize, int stride, int b, int* ret_num_corners); 27 | 28 | xy* nonmax_suppression(const xy* corners, const int* scores, int num_corners, int* ret_num_nonmax); 29 | 30 | 31 | #endif 32 | -------------------------------------------------------------------------------- /fast.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include "fast.h" 3 | 4 | 5 | xy* fast9_detect_nonmax(const byte* im, int xsize, int ysize, int stride, int b, int* ret_num_corners) 6 | { 7 | xy* corners; 8 | int num_corners; 9 | int* scores; 10 | xy* nonmax; 11 | 12 | corners = fast9_detect(im, xsize, ysize, stride, b, &num_corners); 13 | scores = fast9_score(im, stride, corners, num_corners, b); 14 | nonmax = nonmax_suppression(corners, scores, num_corners, ret_num_corners); 15 | 16 | free(corners); 17 | free(scores); 18 | 19 | return nonmax; 20 | } 21 | 22 | xy* fast10_detect_nonmax(const byte* im, int xsize, int ysize, int stride, int b, int* ret_num_corners) 23 | { 24 | xy* corners; 25 | int num_corners; 26 | int* scores; 27 | xy* nonmax; 28 | 29 | corners = fast10_detect(im, xsize, ysize, stride, b, &num_corners); 30 | scores = fast10_score(im, stride, corners, num_corners, b); 31 | nonmax = nonmax_suppression(corners, scores, num_corners, ret_num_corners); 32 | 33 | free(corners); 34 | free(scores); 35 | 36 | return nonmax; 37 | } 38 | 39 | xy* fast11_detect_nonmax(const byte* im, int xsize, int ysize, int stride, int b, int* ret_num_corners) 40 | { 41 | xy* corners; 42 | int num_corners; 43 | int* scores; 44 | xy* nonmax; 45 | 46 | corners = fast11_detect(im, xsize, ysize, stride, b, &num_corners); 47 | scores = fast11_score(im, stride, corners, num_corners, b); 48 | nonmax = nonmax_suppression(corners, scores, num_corners, ret_num_corners); 49 | 50 | free(corners); 51 | free(scores); 52 | 53 | return nonmax; 54 | } 55 | 56 | xy* fast12_detect_nonmax(const byte* im, int xsize, int ysize, int stride, int b, int* ret_num_corners) 57 | { 58 | xy* corners; 59 | int num_corners; 60 | int* scores; 61 | xy* nonmax; 62 | 63 | corners = fast12_detect(im, xsize, ysize, stride, b, &num_corners); 64 | scores = fast12_score(im, stride, corners, num_corners, b); 65 | nonmax = nonmax_suppression(corners, scores, num_corners, ret_num_corners); 66 | 67 | free(corners); 68 | free(scores); 69 | 70 | return nonmax; 71 | } 72 | -------------------------------------------------------------------------------- /nonmax.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include "fast.h" 3 | 4 | 5 | #define Compare(X, Y) ((X)>=(Y)) 6 | 7 | xy* nonmax_suppression(const xy* corners, const int* scores, int num_corners, int* ret_num_nonmax) 8 | { 9 | int num_nonmax=0; 10 | int last_row; 11 | int* row_start; 12 | int i, j; 13 | xy* ret_nonmax; 14 | const int sz = (int)num_corners; 15 | 16 | /*Point above points (roughly) to the pixel above the one of interest, if there 17 | is a feature there.*/ 18 | int point_above = 0; 19 | int point_below = 0; 20 | 21 | 22 | if(num_corners < 1) 23 | { 24 | *ret_num_nonmax = 0; 25 | return 0; 26 | } 27 | 28 | ret_nonmax = (xy*)malloc(num_corners * sizeof(xy)); 29 | 30 | /* Find where each row begins 31 | (the corners are output in raster scan order). A beginning of -1 signifies 32 | that there are no corners on that row. */ 33 | last_row = corners[num_corners-1].y; 34 | row_start = (int*)malloc((last_row+1)*sizeof(int)); 35 | 36 | for(i=0; i < last_row+1; i++) 37 | row_start[i] = -1; 38 | 39 | { 40 | int prev_row = -1; 41 | for(i=0; i< num_corners; i++) 42 | if(corners[i].y != prev_row) 43 | { 44 | row_start[corners[i].y] = i; 45 | prev_row = corners[i].y; 46 | } 47 | } 48 | 49 | 50 | 51 | for(i=0; i < sz; i++) 52 | { 53 | int score = scores[i]; 54 | xy pos = corners[i]; 55 | 56 | /*Check left */ 57 | if(i > 0) 58 | if(corners[i-1].x == pos.x-1 && corners[i-1].y == pos.y && Compare(scores[i-1], score)) 59 | continue; 60 | 61 | /*Check right*/ 62 | if(i < (sz - 1)) 63 | if(corners[i+1].x == pos.x+1 && corners[i+1].y == pos.y && Compare(scores[i+1], score)) 64 | continue; 65 | 66 | /*Check above (if there is a valid row above)*/ 67 | if(pos.y != 0 && row_start[pos.y - 1] != -1) 68 | { 69 | /*Make sure that current point_above is one 70 | row above.*/ 71 | if(corners[point_above].y < pos.y - 1) 72 | point_above = row_start[pos.y-1]; 73 | 74 | /*Make point_above point to the first of the pixels above the current point, 75 | if it exists.*/ 76 | for(; corners[point_above].y < pos.y && corners[point_above].x < pos.x - 1; point_above++) 77 | {} 78 | 79 | 80 | for(j=point_above; corners[j].y < pos.y && corners[j].x <= pos.x + 1; j++) 81 | { 82 | int x = corners[j].x; 83 | if( (x == pos.x - 1 || x ==pos.x || x == pos.x+1) && Compare(scores[j], score)) 84 | goto cont; 85 | } 86 | 87 | } 88 | 89 | /*Check below (if there is anything below)*/ 90 | if(pos.y != last_row && row_start[pos.y + 1] != -1 && point_below < sz) /*Nothing below*/ 91 | { 92 | if(corners[point_below].y < pos.y + 1) 93 | point_below = row_start[pos.y+1]; 94 | 95 | /* Make point below point to one of the pixels belowthe current point, if it 96 | exists.*/ 97 | for(; point_below < sz && corners[point_below].y == pos.y+1 && corners[point_below].x < pos.x - 1; point_below++) 98 | {} 99 | 100 | for(j=point_below; j < sz && corners[j].y == pos.y+1 && corners[j].x <= pos.x + 1; j++) 101 | { 102 | int x = corners[j].x; 103 | if( (x == pos.x - 1 || x ==pos.x || x == pos.x+1) && Compare(scores[j],score)) 104 | goto cont; 105 | } 106 | } 107 | 108 | ret_nonmax[num_nonmax++] = corners[i]; 109 | cont: 110 | ; 111 | } 112 | 113 | free(row_start); 114 | *ret_num_nonmax = num_nonmax; 115 | return ret_nonmax; 116 | } 117 | 118 | -------------------------------------------------------------------------------- /fast_12.c: -------------------------------------------------------------------------------- 1 | /*This is mechanically generated code*/ 2 | #include 3 | 4 | typedef struct { int x, y; } xy; 5 | typedef unsigned char byte; 6 | 7 | int fast12_corner_score(const byte* p, const int pixel[], int bstart) 8 | { 9 | int bmin = bstart; 10 | int bmax = 255; 11 | int b = (bmax + bmin)/2; 12 | 13 | /*Compute the score using binary search*/ 14 | for(;;) 15 | { 16 | int cb = *p + b; 17 | int c_b= *p - b; 18 | 19 | 20 | if( p[pixel[0]] > cb) 21 | if( p[pixel[1]] > cb) 22 | if( p[pixel[2]] > cb) 23 | if( p[pixel[3]] > cb) 24 | if( p[pixel[4]] > cb) 25 | if( p[pixel[5]] > cb) 26 | if( p[pixel[6]] > cb) 27 | if( p[pixel[7]] > cb) 28 | if( p[pixel[8]] > cb) 29 | if( p[pixel[9]] > cb) 30 | if( p[pixel[10]] > cb) 31 | if( p[pixel[11]] > cb) 32 | goto is_a_corner; 33 | else 34 | if( p[pixel[15]] > cb) 35 | goto is_a_corner; 36 | else 37 | goto is_not_a_corner; 38 | else 39 | if( p[pixel[14]] > cb) 40 | if( p[pixel[15]] > cb) 41 | goto is_a_corner; 42 | else 43 | goto is_not_a_corner; 44 | else 45 | goto is_not_a_corner; 46 | else 47 | if( p[pixel[13]] > cb) 48 | if( p[pixel[14]] > cb) 49 | if( p[pixel[15]] > cb) 50 | goto is_a_corner; 51 | else 52 | goto is_not_a_corner; 53 | else 54 | goto is_not_a_corner; 55 | else 56 | goto is_not_a_corner; 57 | else 58 | if( p[pixel[12]] > cb) 59 | if( p[pixel[13]] > cb) 60 | if( p[pixel[14]] > cb) 61 | if( p[pixel[15]] > cb) 62 | goto is_a_corner; 63 | else 64 | goto is_not_a_corner; 65 | else 66 | goto is_not_a_corner; 67 | else 68 | goto is_not_a_corner; 69 | else 70 | goto is_not_a_corner; 71 | else 72 | if( p[pixel[11]] > cb) 73 | if( p[pixel[12]] > cb) 74 | if( p[pixel[13]] > cb) 75 | if( p[pixel[14]] > cb) 76 | if( p[pixel[15]] > cb) 77 | goto is_a_corner; 78 | else 79 | goto is_not_a_corner; 80 | else 81 | goto is_not_a_corner; 82 | else 83 | goto is_not_a_corner; 84 | else 85 | goto is_not_a_corner; 86 | else 87 | goto is_not_a_corner; 88 | else 89 | if( p[pixel[10]] > cb) 90 | if( p[pixel[11]] > cb) 91 | if( p[pixel[12]] > cb) 92 | if( p[pixel[13]] > cb) 93 | if( p[pixel[14]] > cb) 94 | if( p[pixel[15]] > cb) 95 | goto is_a_corner; 96 | else 97 | goto is_not_a_corner; 98 | else 99 | goto is_not_a_corner; 100 | else 101 | goto is_not_a_corner; 102 | else 103 | goto is_not_a_corner; 104 | else 105 | goto is_not_a_corner; 106 | else 107 | goto is_not_a_corner; 108 | else 109 | if( p[pixel[9]] > cb) 110 | if( p[pixel[10]] > cb) 111 | if( p[pixel[11]] > cb) 112 | if( p[pixel[12]] > cb) 113 | if( p[pixel[13]] > cb) 114 | if( p[pixel[14]] > cb) 115 | if( p[pixel[15]] > cb) 116 | goto is_a_corner; 117 | else 118 | goto is_not_a_corner; 119 | else 120 | goto is_not_a_corner; 121 | else 122 | goto is_not_a_corner; 123 | else 124 | goto is_not_a_corner; 125 | else 126 | goto is_not_a_corner; 127 | else 128 | goto is_not_a_corner; 129 | else 130 | goto is_not_a_corner; 131 | else if( p[pixel[4]] < c_b) 132 | if( p[pixel[8]] > cb) 133 | if( p[pixel[9]] > cb) 134 | if( p[pixel[10]] > cb) 135 | if( p[pixel[11]] > cb) 136 | if( p[pixel[12]] > cb) 137 | if( p[pixel[13]] > cb) 138 | if( p[pixel[14]] > cb) 139 | if( p[pixel[15]] > cb) 140 | goto is_a_corner; 141 | else 142 | goto is_not_a_corner; 143 | else 144 | goto is_not_a_corner; 145 | else 146 | goto is_not_a_corner; 147 | else 148 | goto is_not_a_corner; 149 | else 150 | goto is_not_a_corner; 151 | else 152 | goto is_not_a_corner; 153 | else 154 | goto is_not_a_corner; 155 | else if( p[pixel[8]] < c_b) 156 | if( p[pixel[5]] < c_b) 157 | if( p[pixel[6]] < c_b) 158 | if( p[pixel[7]] < c_b) 159 | if( p[pixel[9]] < c_b) 160 | if( p[pixel[10]] < c_b) 161 | if( p[pixel[11]] < c_b) 162 | if( p[pixel[12]] < c_b) 163 | if( p[pixel[13]] < c_b) 164 | if( p[pixel[14]] < c_b) 165 | if( p[pixel[15]] < c_b) 166 | goto is_a_corner; 167 | else 168 | goto is_not_a_corner; 169 | else 170 | goto is_not_a_corner; 171 | else 172 | goto is_not_a_corner; 173 | else 174 | goto is_not_a_corner; 175 | else 176 | goto is_not_a_corner; 177 | else 178 | goto is_not_a_corner; 179 | else 180 | goto is_not_a_corner; 181 | else 182 | goto is_not_a_corner; 183 | else 184 | goto is_not_a_corner; 185 | else 186 | goto is_not_a_corner; 187 | else 188 | goto is_not_a_corner; 189 | else 190 | if( p[pixel[8]] > cb) 191 | if( p[pixel[9]] > cb) 192 | if( p[pixel[10]] > cb) 193 | if( p[pixel[11]] > cb) 194 | if( p[pixel[12]] > cb) 195 | if( p[pixel[13]] > cb) 196 | if( p[pixel[14]] > cb) 197 | if( p[pixel[15]] > cb) 198 | goto is_a_corner; 199 | else 200 | goto is_not_a_corner; 201 | else 202 | goto is_not_a_corner; 203 | else 204 | goto is_not_a_corner; 205 | else 206 | goto is_not_a_corner; 207 | else 208 | goto is_not_a_corner; 209 | else 210 | goto is_not_a_corner; 211 | else 212 | goto is_not_a_corner; 213 | else 214 | goto is_not_a_corner; 215 | else if( p[pixel[3]] < c_b) 216 | if( p[pixel[15]] > cb) 217 | if( p[pixel[7]] > cb) 218 | if( p[pixel[8]] > cb) 219 | if( p[pixel[9]] > cb) 220 | if( p[pixel[10]] > cb) 221 | if( p[pixel[11]] > cb) 222 | if( p[pixel[12]] > cb) 223 | if( p[pixel[13]] > cb) 224 | if( p[pixel[14]] > cb) 225 | goto is_a_corner; 226 | else 227 | goto is_not_a_corner; 228 | else 229 | goto is_not_a_corner; 230 | else 231 | goto is_not_a_corner; 232 | else 233 | goto is_not_a_corner; 234 | else 235 | goto is_not_a_corner; 236 | else 237 | goto is_not_a_corner; 238 | else 239 | goto is_not_a_corner; 240 | else if( p[pixel[7]] < c_b) 241 | if( p[pixel[4]] < c_b) 242 | if( p[pixel[5]] < c_b) 243 | if( p[pixel[6]] < c_b) 244 | if( p[pixel[8]] < c_b) 245 | if( p[pixel[9]] < c_b) 246 | if( p[pixel[10]] < c_b) 247 | if( p[pixel[11]] < c_b) 248 | if( p[pixel[12]] < c_b) 249 | if( p[pixel[13]] < c_b) 250 | if( p[pixel[14]] < c_b) 251 | goto is_a_corner; 252 | else 253 | goto is_not_a_corner; 254 | else 255 | goto is_not_a_corner; 256 | else 257 | goto is_not_a_corner; 258 | else 259 | goto is_not_a_corner; 260 | else 261 | goto is_not_a_corner; 262 | else 263 | goto is_not_a_corner; 264 | else 265 | goto is_not_a_corner; 266 | else 267 | goto is_not_a_corner; 268 | else 269 | goto is_not_a_corner; 270 | else 271 | goto is_not_a_corner; 272 | else 273 | goto is_not_a_corner; 274 | else 275 | if( p[pixel[4]] < c_b) 276 | if( p[pixel[5]] < c_b) 277 | if( p[pixel[6]] < c_b) 278 | if( p[pixel[7]] < c_b) 279 | if( p[pixel[8]] < c_b) 280 | if( p[pixel[9]] < c_b) 281 | if( p[pixel[10]] < c_b) 282 | if( p[pixel[11]] < c_b) 283 | if( p[pixel[12]] < c_b) 284 | if( p[pixel[13]] < c_b) 285 | if( p[pixel[14]] < c_b) 286 | goto is_a_corner; 287 | else 288 | goto is_not_a_corner; 289 | else 290 | goto is_not_a_corner; 291 | else 292 | goto is_not_a_corner; 293 | else 294 | goto is_not_a_corner; 295 | else 296 | goto is_not_a_corner; 297 | else 298 | goto is_not_a_corner; 299 | else 300 | goto is_not_a_corner; 301 | else 302 | goto is_not_a_corner; 303 | else 304 | goto is_not_a_corner; 305 | else 306 | goto is_not_a_corner; 307 | else 308 | goto is_not_a_corner; 309 | else 310 | if( p[pixel[7]] > cb) 311 | if( p[pixel[8]] > cb) 312 | if( p[pixel[9]] > cb) 313 | if( p[pixel[10]] > cb) 314 | if( p[pixel[11]] > cb) 315 | if( p[pixel[12]] > cb) 316 | if( p[pixel[13]] > cb) 317 | if( p[pixel[14]] > cb) 318 | if( p[pixel[15]] > cb) 319 | goto is_a_corner; 320 | else 321 | goto is_not_a_corner; 322 | else 323 | goto is_not_a_corner; 324 | else 325 | goto is_not_a_corner; 326 | else 327 | goto is_not_a_corner; 328 | else 329 | goto is_not_a_corner; 330 | else 331 | goto is_not_a_corner; 332 | else 333 | goto is_not_a_corner; 334 | else 335 | goto is_not_a_corner; 336 | else if( p[pixel[7]] < c_b) 337 | if( p[pixel[4]] < c_b) 338 | if( p[pixel[5]] < c_b) 339 | if( p[pixel[6]] < c_b) 340 | if( p[pixel[8]] < c_b) 341 | if( p[pixel[9]] < c_b) 342 | if( p[pixel[10]] < c_b) 343 | if( p[pixel[11]] < c_b) 344 | if( p[pixel[12]] < c_b) 345 | if( p[pixel[13]] < c_b) 346 | if( p[pixel[14]] < c_b) 347 | if( p[pixel[15]] < c_b) 348 | goto is_a_corner; 349 | else 350 | goto is_not_a_corner; 351 | else 352 | goto is_not_a_corner; 353 | else 354 | goto is_not_a_corner; 355 | else 356 | goto is_not_a_corner; 357 | else 358 | goto is_not_a_corner; 359 | else 360 | goto is_not_a_corner; 361 | else 362 | goto is_not_a_corner; 363 | else 364 | goto is_not_a_corner; 365 | else 366 | goto is_not_a_corner; 367 | else 368 | goto is_not_a_corner; 369 | else 370 | goto is_not_a_corner; 371 | else 372 | goto is_not_a_corner; 373 | else if( p[pixel[2]] < c_b) 374 | if( p[pixel[6]] > cb) 375 | if( p[pixel[7]] > cb) 376 | if( p[pixel[8]] > cb) 377 | if( p[pixel[9]] > cb) 378 | if( p[pixel[10]] > cb) 379 | if( p[pixel[11]] > cb) 380 | if( p[pixel[12]] > cb) 381 | if( p[pixel[13]] > cb) 382 | if( p[pixel[14]] > cb) 383 | if( p[pixel[15]] > cb) 384 | goto is_a_corner; 385 | else 386 | if( p[pixel[3]] > cb) 387 | if( p[pixel[4]] > cb) 388 | if( p[pixel[5]] > cb) 389 | goto is_a_corner; 390 | else 391 | goto is_not_a_corner; 392 | else 393 | goto is_not_a_corner; 394 | else 395 | goto is_not_a_corner; 396 | else 397 | goto is_not_a_corner; 398 | else 399 | goto is_not_a_corner; 400 | else 401 | goto is_not_a_corner; 402 | else 403 | goto is_not_a_corner; 404 | else 405 | goto is_not_a_corner; 406 | else 407 | goto is_not_a_corner; 408 | else 409 | goto is_not_a_corner; 410 | else 411 | goto is_not_a_corner; 412 | else if( p[pixel[6]] < c_b) 413 | if( p[pixel[4]] < c_b) 414 | if( p[pixel[5]] < c_b) 415 | if( p[pixel[7]] < c_b) 416 | if( p[pixel[8]] < c_b) 417 | if( p[pixel[9]] < c_b) 418 | if( p[pixel[10]] < c_b) 419 | if( p[pixel[11]] < c_b) 420 | if( p[pixel[12]] < c_b) 421 | if( p[pixel[13]] < c_b) 422 | if( p[pixel[3]] < c_b) 423 | goto is_a_corner; 424 | else 425 | if( p[pixel[14]] < c_b) 426 | if( p[pixel[15]] < c_b) 427 | goto is_a_corner; 428 | else 429 | goto is_not_a_corner; 430 | else 431 | goto is_not_a_corner; 432 | else 433 | goto is_not_a_corner; 434 | else 435 | goto is_not_a_corner; 436 | else 437 | goto is_not_a_corner; 438 | else 439 | goto is_not_a_corner; 440 | else 441 | goto is_not_a_corner; 442 | else 443 | goto is_not_a_corner; 444 | else 445 | goto is_not_a_corner; 446 | else 447 | goto is_not_a_corner; 448 | else 449 | goto is_not_a_corner; 450 | else 451 | goto is_not_a_corner; 452 | else 453 | if( p[pixel[6]] > cb) 454 | if( p[pixel[7]] > cb) 455 | if( p[pixel[8]] > cb) 456 | if( p[pixel[9]] > cb) 457 | if( p[pixel[10]] > cb) 458 | if( p[pixel[11]] > cb) 459 | if( p[pixel[12]] > cb) 460 | if( p[pixel[13]] > cb) 461 | if( p[pixel[14]] > cb) 462 | if( p[pixel[15]] > cb) 463 | goto is_a_corner; 464 | else 465 | if( p[pixel[3]] > cb) 466 | if( p[pixel[4]] > cb) 467 | if( p[pixel[5]] > cb) 468 | goto is_a_corner; 469 | else 470 | goto is_not_a_corner; 471 | else 472 | goto is_not_a_corner; 473 | else 474 | goto is_not_a_corner; 475 | else 476 | goto is_not_a_corner; 477 | else 478 | goto is_not_a_corner; 479 | else 480 | goto is_not_a_corner; 481 | else 482 | goto is_not_a_corner; 483 | else 484 | goto is_not_a_corner; 485 | else 486 | goto is_not_a_corner; 487 | else 488 | goto is_not_a_corner; 489 | else 490 | goto is_not_a_corner; 491 | else if( p[pixel[6]] < c_b) 492 | if( p[pixel[4]] < c_b) 493 | if( p[pixel[5]] < c_b) 494 | if( p[pixel[7]] < c_b) 495 | if( p[pixel[8]] < c_b) 496 | if( p[pixel[9]] < c_b) 497 | if( p[pixel[10]] < c_b) 498 | if( p[pixel[11]] < c_b) 499 | if( p[pixel[12]] < c_b) 500 | if( p[pixel[13]] < c_b) 501 | if( p[pixel[14]] < c_b) 502 | if( p[pixel[3]] < c_b) 503 | goto is_a_corner; 504 | else 505 | if( p[pixel[15]] < c_b) 506 | goto is_a_corner; 507 | else 508 | goto is_not_a_corner; 509 | else 510 | goto is_not_a_corner; 511 | else 512 | goto is_not_a_corner; 513 | else 514 | goto is_not_a_corner; 515 | else 516 | goto is_not_a_corner; 517 | else 518 | goto is_not_a_corner; 519 | else 520 | goto is_not_a_corner; 521 | else 522 | goto is_not_a_corner; 523 | else 524 | goto is_not_a_corner; 525 | else 526 | goto is_not_a_corner; 527 | else 528 | goto is_not_a_corner; 529 | else 530 | goto is_not_a_corner; 531 | else if( p[pixel[1]] < c_b) 532 | if( p[pixel[5]] > cb) 533 | if( p[pixel[6]] > cb) 534 | if( p[pixel[7]] > cb) 535 | if( p[pixel[8]] > cb) 536 | if( p[pixel[9]] > cb) 537 | if( p[pixel[10]] > cb) 538 | if( p[pixel[11]] > cb) 539 | if( p[pixel[12]] > cb) 540 | if( p[pixel[13]] > cb) 541 | if( p[pixel[14]] > cb) 542 | if( p[pixel[15]] > cb) 543 | goto is_a_corner; 544 | else 545 | if( p[pixel[3]] > cb) 546 | if( p[pixel[4]] > cb) 547 | goto is_a_corner; 548 | else 549 | goto is_not_a_corner; 550 | else 551 | goto is_not_a_corner; 552 | else 553 | if( p[pixel[2]] > cb) 554 | if( p[pixel[3]] > cb) 555 | if( p[pixel[4]] > cb) 556 | goto is_a_corner; 557 | else 558 | goto is_not_a_corner; 559 | else 560 | goto is_not_a_corner; 561 | else 562 | goto is_not_a_corner; 563 | else 564 | goto is_not_a_corner; 565 | else 566 | goto is_not_a_corner; 567 | else 568 | goto is_not_a_corner; 569 | else 570 | goto is_not_a_corner; 571 | else 572 | goto is_not_a_corner; 573 | else 574 | goto is_not_a_corner; 575 | else 576 | goto is_not_a_corner; 577 | else 578 | goto is_not_a_corner; 579 | else if( p[pixel[5]] < c_b) 580 | if( p[pixel[4]] < c_b) 581 | if( p[pixel[6]] < c_b) 582 | if( p[pixel[7]] < c_b) 583 | if( p[pixel[8]] < c_b) 584 | if( p[pixel[9]] < c_b) 585 | if( p[pixel[10]] < c_b) 586 | if( p[pixel[11]] < c_b) 587 | if( p[pixel[12]] < c_b) 588 | if( p[pixel[3]] < c_b) 589 | if( p[pixel[2]] < c_b) 590 | goto is_a_corner; 591 | else 592 | if( p[pixel[13]] < c_b) 593 | if( p[pixel[14]] < c_b) 594 | goto is_a_corner; 595 | else 596 | goto is_not_a_corner; 597 | else 598 | goto is_not_a_corner; 599 | else 600 | if( p[pixel[13]] < c_b) 601 | if( p[pixel[14]] < c_b) 602 | if( p[pixel[15]] < c_b) 603 | goto is_a_corner; 604 | else 605 | goto is_not_a_corner; 606 | else 607 | goto is_not_a_corner; 608 | else 609 | goto is_not_a_corner; 610 | else 611 | goto is_not_a_corner; 612 | else 613 | goto is_not_a_corner; 614 | else 615 | goto is_not_a_corner; 616 | else 617 | goto is_not_a_corner; 618 | else 619 | goto is_not_a_corner; 620 | else 621 | goto is_not_a_corner; 622 | else 623 | goto is_not_a_corner; 624 | else 625 | goto is_not_a_corner; 626 | else 627 | goto is_not_a_corner; 628 | else 629 | if( p[pixel[5]] > cb) 630 | if( p[pixel[6]] > cb) 631 | if( p[pixel[7]] > cb) 632 | if( p[pixel[8]] > cb) 633 | if( p[pixel[9]] > cb) 634 | if( p[pixel[10]] > cb) 635 | if( p[pixel[11]] > cb) 636 | if( p[pixel[12]] > cb) 637 | if( p[pixel[13]] > cb) 638 | if( p[pixel[14]] > cb) 639 | if( p[pixel[15]] > cb) 640 | goto is_a_corner; 641 | else 642 | if( p[pixel[3]] > cb) 643 | if( p[pixel[4]] > cb) 644 | goto is_a_corner; 645 | else 646 | goto is_not_a_corner; 647 | else 648 | goto is_not_a_corner; 649 | else 650 | if( p[pixel[2]] > cb) 651 | if( p[pixel[3]] > cb) 652 | if( p[pixel[4]] > cb) 653 | goto is_a_corner; 654 | else 655 | goto is_not_a_corner; 656 | else 657 | goto is_not_a_corner; 658 | else 659 | goto is_not_a_corner; 660 | else 661 | goto is_not_a_corner; 662 | else 663 | goto is_not_a_corner; 664 | else 665 | goto is_not_a_corner; 666 | else 667 | goto is_not_a_corner; 668 | else 669 | goto is_not_a_corner; 670 | else 671 | goto is_not_a_corner; 672 | else 673 | goto is_not_a_corner; 674 | else 675 | goto is_not_a_corner; 676 | else if( p[pixel[5]] < c_b) 677 | if( p[pixel[4]] < c_b) 678 | if( p[pixel[6]] < c_b) 679 | if( p[pixel[7]] < c_b) 680 | if( p[pixel[8]] < c_b) 681 | if( p[pixel[9]] < c_b) 682 | if( p[pixel[10]] < c_b) 683 | if( p[pixel[11]] < c_b) 684 | if( p[pixel[12]] < c_b) 685 | if( p[pixel[13]] < c_b) 686 | if( p[pixel[3]] < c_b) 687 | if( p[pixel[2]] < c_b) 688 | goto is_a_corner; 689 | else 690 | if( p[pixel[14]] < c_b) 691 | goto is_a_corner; 692 | else 693 | goto is_not_a_corner; 694 | else 695 | if( p[pixel[14]] < c_b) 696 | if( p[pixel[15]] < c_b) 697 | goto is_a_corner; 698 | else 699 | goto is_not_a_corner; 700 | else 701 | goto is_not_a_corner; 702 | else 703 | goto is_not_a_corner; 704 | else 705 | goto is_not_a_corner; 706 | else 707 | goto is_not_a_corner; 708 | else 709 | goto is_not_a_corner; 710 | else 711 | goto is_not_a_corner; 712 | else 713 | goto is_not_a_corner; 714 | else 715 | goto is_not_a_corner; 716 | else 717 | goto is_not_a_corner; 718 | else 719 | goto is_not_a_corner; 720 | else 721 | goto is_not_a_corner; 722 | else if( p[pixel[0]] < c_b) 723 | if( p[pixel[1]] > cb) 724 | if( p[pixel[5]] > cb) 725 | if( p[pixel[4]] > cb) 726 | if( p[pixel[6]] > cb) 727 | if( p[pixel[7]] > cb) 728 | if( p[pixel[8]] > cb) 729 | if( p[pixel[9]] > cb) 730 | if( p[pixel[10]] > cb) 731 | if( p[pixel[11]] > cb) 732 | if( p[pixel[12]] > cb) 733 | if( p[pixel[3]] > cb) 734 | if( p[pixel[2]] > cb) 735 | goto is_a_corner; 736 | else 737 | if( p[pixel[13]] > cb) 738 | if( p[pixel[14]] > cb) 739 | goto is_a_corner; 740 | else 741 | goto is_not_a_corner; 742 | else 743 | goto is_not_a_corner; 744 | else 745 | if( p[pixel[13]] > cb) 746 | if( p[pixel[14]] > cb) 747 | if( p[pixel[15]] > cb) 748 | goto is_a_corner; 749 | else 750 | goto is_not_a_corner; 751 | else 752 | goto is_not_a_corner; 753 | else 754 | goto is_not_a_corner; 755 | else 756 | goto is_not_a_corner; 757 | else 758 | goto is_not_a_corner; 759 | else 760 | goto is_not_a_corner; 761 | else 762 | goto is_not_a_corner; 763 | else 764 | goto is_not_a_corner; 765 | else 766 | goto is_not_a_corner; 767 | else 768 | goto is_not_a_corner; 769 | else 770 | goto is_not_a_corner; 771 | else if( p[pixel[5]] < c_b) 772 | if( p[pixel[6]] < c_b) 773 | if( p[pixel[7]] < c_b) 774 | if( p[pixel[8]] < c_b) 775 | if( p[pixel[9]] < c_b) 776 | if( p[pixel[10]] < c_b) 777 | if( p[pixel[11]] < c_b) 778 | if( p[pixel[12]] < c_b) 779 | if( p[pixel[13]] < c_b) 780 | if( p[pixel[14]] < c_b) 781 | if( p[pixel[15]] < c_b) 782 | goto is_a_corner; 783 | else 784 | if( p[pixel[3]] < c_b) 785 | if( p[pixel[4]] < c_b) 786 | goto is_a_corner; 787 | else 788 | goto is_not_a_corner; 789 | else 790 | goto is_not_a_corner; 791 | else 792 | if( p[pixel[2]] < c_b) 793 | if( p[pixel[3]] < c_b) 794 | if( p[pixel[4]] < c_b) 795 | goto is_a_corner; 796 | else 797 | goto is_not_a_corner; 798 | else 799 | goto is_not_a_corner; 800 | else 801 | goto is_not_a_corner; 802 | else 803 | goto is_not_a_corner; 804 | else 805 | goto is_not_a_corner; 806 | else 807 | goto is_not_a_corner; 808 | else 809 | goto is_not_a_corner; 810 | else 811 | goto is_not_a_corner; 812 | else 813 | goto is_not_a_corner; 814 | else 815 | goto is_not_a_corner; 816 | else 817 | goto is_not_a_corner; 818 | else 819 | goto is_not_a_corner; 820 | else if( p[pixel[1]] < c_b) 821 | if( p[pixel[2]] > cb) 822 | if( p[pixel[6]] > cb) 823 | if( p[pixel[4]] > cb) 824 | if( p[pixel[5]] > cb) 825 | if( p[pixel[7]] > cb) 826 | if( p[pixel[8]] > cb) 827 | if( p[pixel[9]] > cb) 828 | if( p[pixel[10]] > cb) 829 | if( p[pixel[11]] > cb) 830 | if( p[pixel[12]] > cb) 831 | if( p[pixel[13]] > cb) 832 | if( p[pixel[3]] > cb) 833 | goto is_a_corner; 834 | else 835 | if( p[pixel[14]] > cb) 836 | if( p[pixel[15]] > cb) 837 | goto is_a_corner; 838 | else 839 | goto is_not_a_corner; 840 | else 841 | goto is_not_a_corner; 842 | else 843 | goto is_not_a_corner; 844 | else 845 | goto is_not_a_corner; 846 | else 847 | goto is_not_a_corner; 848 | else 849 | goto is_not_a_corner; 850 | else 851 | goto is_not_a_corner; 852 | else 853 | goto is_not_a_corner; 854 | else 855 | goto is_not_a_corner; 856 | else 857 | goto is_not_a_corner; 858 | else 859 | goto is_not_a_corner; 860 | else if( p[pixel[6]] < c_b) 861 | if( p[pixel[7]] < c_b) 862 | if( p[pixel[8]] < c_b) 863 | if( p[pixel[9]] < c_b) 864 | if( p[pixel[10]] < c_b) 865 | if( p[pixel[11]] < c_b) 866 | if( p[pixel[12]] < c_b) 867 | if( p[pixel[13]] < c_b) 868 | if( p[pixel[14]] < c_b) 869 | if( p[pixel[15]] < c_b) 870 | goto is_a_corner; 871 | else 872 | if( p[pixel[3]] < c_b) 873 | if( p[pixel[4]] < c_b) 874 | if( p[pixel[5]] < c_b) 875 | goto is_a_corner; 876 | else 877 | goto is_not_a_corner; 878 | else 879 | goto is_not_a_corner; 880 | else 881 | goto is_not_a_corner; 882 | else 883 | goto is_not_a_corner; 884 | else 885 | goto is_not_a_corner; 886 | else 887 | goto is_not_a_corner; 888 | else 889 | goto is_not_a_corner; 890 | else 891 | goto is_not_a_corner; 892 | else 893 | goto is_not_a_corner; 894 | else 895 | goto is_not_a_corner; 896 | else 897 | goto is_not_a_corner; 898 | else 899 | goto is_not_a_corner; 900 | else if( p[pixel[2]] < c_b) 901 | if( p[pixel[3]] > cb) 902 | if( p[pixel[15]] < c_b) 903 | if( p[pixel[7]] > cb) 904 | if( p[pixel[4]] > cb) 905 | if( p[pixel[5]] > cb) 906 | if( p[pixel[6]] > cb) 907 | if( p[pixel[8]] > cb) 908 | if( p[pixel[9]] > cb) 909 | if( p[pixel[10]] > cb) 910 | if( p[pixel[11]] > cb) 911 | if( p[pixel[12]] > cb) 912 | if( p[pixel[13]] > cb) 913 | if( p[pixel[14]] > cb) 914 | goto is_a_corner; 915 | else 916 | goto is_not_a_corner; 917 | else 918 | goto is_not_a_corner; 919 | else 920 | goto is_not_a_corner; 921 | else 922 | goto is_not_a_corner; 923 | else 924 | goto is_not_a_corner; 925 | else 926 | goto is_not_a_corner; 927 | else 928 | goto is_not_a_corner; 929 | else 930 | goto is_not_a_corner; 931 | else 932 | goto is_not_a_corner; 933 | else 934 | goto is_not_a_corner; 935 | else if( p[pixel[7]] < c_b) 936 | if( p[pixel[8]] < c_b) 937 | if( p[pixel[9]] < c_b) 938 | if( p[pixel[10]] < c_b) 939 | if( p[pixel[11]] < c_b) 940 | if( p[pixel[12]] < c_b) 941 | if( p[pixel[13]] < c_b) 942 | if( p[pixel[14]] < c_b) 943 | goto is_a_corner; 944 | else 945 | goto is_not_a_corner; 946 | else 947 | goto is_not_a_corner; 948 | else 949 | goto is_not_a_corner; 950 | else 951 | goto is_not_a_corner; 952 | else 953 | goto is_not_a_corner; 954 | else 955 | goto is_not_a_corner; 956 | else 957 | goto is_not_a_corner; 958 | else 959 | goto is_not_a_corner; 960 | else 961 | if( p[pixel[4]] > cb) 962 | if( p[pixel[5]] > cb) 963 | if( p[pixel[6]] > cb) 964 | if( p[pixel[7]] > cb) 965 | if( p[pixel[8]] > cb) 966 | if( p[pixel[9]] > cb) 967 | if( p[pixel[10]] > cb) 968 | if( p[pixel[11]] > cb) 969 | if( p[pixel[12]] > cb) 970 | if( p[pixel[13]] > cb) 971 | if( p[pixel[14]] > cb) 972 | goto is_a_corner; 973 | else 974 | goto is_not_a_corner; 975 | else 976 | goto is_not_a_corner; 977 | else 978 | goto is_not_a_corner; 979 | else 980 | goto is_not_a_corner; 981 | else 982 | goto is_not_a_corner; 983 | else 984 | goto is_not_a_corner; 985 | else 986 | goto is_not_a_corner; 987 | else 988 | goto is_not_a_corner; 989 | else 990 | goto is_not_a_corner; 991 | else 992 | goto is_not_a_corner; 993 | else 994 | goto is_not_a_corner; 995 | else if( p[pixel[3]] < c_b) 996 | if( p[pixel[4]] > cb) 997 | if( p[pixel[8]] > cb) 998 | if( p[pixel[5]] > cb) 999 | if( p[pixel[6]] > cb) 1000 | if( p[pixel[7]] > cb) 1001 | if( p[pixel[9]] > cb) 1002 | if( p[pixel[10]] > cb) 1003 | if( p[pixel[11]] > cb) 1004 | if( p[pixel[12]] > cb) 1005 | if( p[pixel[13]] > cb) 1006 | if( p[pixel[14]] > cb) 1007 | if( p[pixel[15]] > cb) 1008 | goto is_a_corner; 1009 | else 1010 | goto is_not_a_corner; 1011 | else 1012 | goto is_not_a_corner; 1013 | else 1014 | goto is_not_a_corner; 1015 | else 1016 | goto is_not_a_corner; 1017 | else 1018 | goto is_not_a_corner; 1019 | else 1020 | goto is_not_a_corner; 1021 | else 1022 | goto is_not_a_corner; 1023 | else 1024 | goto is_not_a_corner; 1025 | else 1026 | goto is_not_a_corner; 1027 | else 1028 | goto is_not_a_corner; 1029 | else if( p[pixel[8]] < c_b) 1030 | if( p[pixel[9]] < c_b) 1031 | if( p[pixel[10]] < c_b) 1032 | if( p[pixel[11]] < c_b) 1033 | if( p[pixel[12]] < c_b) 1034 | if( p[pixel[13]] < c_b) 1035 | if( p[pixel[14]] < c_b) 1036 | if( p[pixel[15]] < c_b) 1037 | goto is_a_corner; 1038 | else 1039 | goto is_not_a_corner; 1040 | else 1041 | goto is_not_a_corner; 1042 | else 1043 | goto is_not_a_corner; 1044 | else 1045 | goto is_not_a_corner; 1046 | else 1047 | goto is_not_a_corner; 1048 | else 1049 | goto is_not_a_corner; 1050 | else 1051 | goto is_not_a_corner; 1052 | else 1053 | goto is_not_a_corner; 1054 | else if( p[pixel[4]] < c_b) 1055 | if( p[pixel[5]] < c_b) 1056 | if( p[pixel[6]] < c_b) 1057 | if( p[pixel[7]] < c_b) 1058 | if( p[pixel[8]] < c_b) 1059 | if( p[pixel[9]] < c_b) 1060 | if( p[pixel[10]] < c_b) 1061 | if( p[pixel[11]] < c_b) 1062 | goto is_a_corner; 1063 | else 1064 | if( p[pixel[15]] < c_b) 1065 | goto is_a_corner; 1066 | else 1067 | goto is_not_a_corner; 1068 | else 1069 | if( p[pixel[14]] < c_b) 1070 | if( p[pixel[15]] < c_b) 1071 | goto is_a_corner; 1072 | else 1073 | goto is_not_a_corner; 1074 | else 1075 | goto is_not_a_corner; 1076 | else 1077 | if( p[pixel[13]] < c_b) 1078 | if( p[pixel[14]] < c_b) 1079 | if( p[pixel[15]] < c_b) 1080 | goto is_a_corner; 1081 | else 1082 | goto is_not_a_corner; 1083 | else 1084 | goto is_not_a_corner; 1085 | else 1086 | goto is_not_a_corner; 1087 | else 1088 | if( p[pixel[12]] < c_b) 1089 | if( p[pixel[13]] < c_b) 1090 | if( p[pixel[14]] < c_b) 1091 | if( p[pixel[15]] < c_b) 1092 | goto is_a_corner; 1093 | else 1094 | goto is_not_a_corner; 1095 | else 1096 | goto is_not_a_corner; 1097 | else 1098 | goto is_not_a_corner; 1099 | else 1100 | goto is_not_a_corner; 1101 | else 1102 | if( p[pixel[11]] < c_b) 1103 | if( p[pixel[12]] < c_b) 1104 | if( p[pixel[13]] < c_b) 1105 | if( p[pixel[14]] < c_b) 1106 | if( p[pixel[15]] < c_b) 1107 | goto is_a_corner; 1108 | else 1109 | goto is_not_a_corner; 1110 | else 1111 | goto is_not_a_corner; 1112 | else 1113 | goto is_not_a_corner; 1114 | else 1115 | goto is_not_a_corner; 1116 | else 1117 | goto is_not_a_corner; 1118 | else 1119 | if( p[pixel[10]] < c_b) 1120 | if( p[pixel[11]] < c_b) 1121 | if( p[pixel[12]] < c_b) 1122 | if( p[pixel[13]] < c_b) 1123 | if( p[pixel[14]] < c_b) 1124 | if( p[pixel[15]] < c_b) 1125 | goto is_a_corner; 1126 | else 1127 | goto is_not_a_corner; 1128 | else 1129 | goto is_not_a_corner; 1130 | else 1131 | goto is_not_a_corner; 1132 | else 1133 | goto is_not_a_corner; 1134 | else 1135 | goto is_not_a_corner; 1136 | else 1137 | goto is_not_a_corner; 1138 | else 1139 | if( p[pixel[9]] < c_b) 1140 | if( p[pixel[10]] < c_b) 1141 | if( p[pixel[11]] < c_b) 1142 | if( p[pixel[12]] < c_b) 1143 | if( p[pixel[13]] < c_b) 1144 | if( p[pixel[14]] < c_b) 1145 | if( p[pixel[15]] < c_b) 1146 | goto is_a_corner; 1147 | else 1148 | goto is_not_a_corner; 1149 | else 1150 | goto is_not_a_corner; 1151 | else 1152 | goto is_not_a_corner; 1153 | else 1154 | goto is_not_a_corner; 1155 | else 1156 | goto is_not_a_corner; 1157 | else 1158 | goto is_not_a_corner; 1159 | else 1160 | goto is_not_a_corner; 1161 | else 1162 | if( p[pixel[8]] < c_b) 1163 | if( p[pixel[9]] < c_b) 1164 | if( p[pixel[10]] < c_b) 1165 | if( p[pixel[11]] < c_b) 1166 | if( p[pixel[12]] < c_b) 1167 | if( p[pixel[13]] < c_b) 1168 | if( p[pixel[14]] < c_b) 1169 | if( p[pixel[15]] < c_b) 1170 | goto is_a_corner; 1171 | else 1172 | goto is_not_a_corner; 1173 | else 1174 | goto is_not_a_corner; 1175 | else 1176 | goto is_not_a_corner; 1177 | else 1178 | goto is_not_a_corner; 1179 | else 1180 | goto is_not_a_corner; 1181 | else 1182 | goto is_not_a_corner; 1183 | else 1184 | goto is_not_a_corner; 1185 | else 1186 | goto is_not_a_corner; 1187 | else 1188 | if( p[pixel[7]] > cb) 1189 | if( p[pixel[4]] > cb) 1190 | if( p[pixel[5]] > cb) 1191 | if( p[pixel[6]] > cb) 1192 | if( p[pixel[8]] > cb) 1193 | if( p[pixel[9]] > cb) 1194 | if( p[pixel[10]] > cb) 1195 | if( p[pixel[11]] > cb) 1196 | if( p[pixel[12]] > cb) 1197 | if( p[pixel[13]] > cb) 1198 | if( p[pixel[14]] > cb) 1199 | if( p[pixel[15]] > cb) 1200 | goto is_a_corner; 1201 | else 1202 | goto is_not_a_corner; 1203 | else 1204 | goto is_not_a_corner; 1205 | else 1206 | goto is_not_a_corner; 1207 | else 1208 | goto is_not_a_corner; 1209 | else 1210 | goto is_not_a_corner; 1211 | else 1212 | goto is_not_a_corner; 1213 | else 1214 | goto is_not_a_corner; 1215 | else 1216 | goto is_not_a_corner; 1217 | else 1218 | goto is_not_a_corner; 1219 | else 1220 | goto is_not_a_corner; 1221 | else 1222 | goto is_not_a_corner; 1223 | else if( p[pixel[7]] < c_b) 1224 | if( p[pixel[8]] < c_b) 1225 | if( p[pixel[9]] < c_b) 1226 | if( p[pixel[10]] < c_b) 1227 | if( p[pixel[11]] < c_b) 1228 | if( p[pixel[12]] < c_b) 1229 | if( p[pixel[13]] < c_b) 1230 | if( p[pixel[14]] < c_b) 1231 | if( p[pixel[15]] < c_b) 1232 | goto is_a_corner; 1233 | else 1234 | goto is_not_a_corner; 1235 | else 1236 | goto is_not_a_corner; 1237 | else 1238 | goto is_not_a_corner; 1239 | else 1240 | goto is_not_a_corner; 1241 | else 1242 | goto is_not_a_corner; 1243 | else 1244 | goto is_not_a_corner; 1245 | else 1246 | goto is_not_a_corner; 1247 | else 1248 | goto is_not_a_corner; 1249 | else 1250 | goto is_not_a_corner; 1251 | else 1252 | if( p[pixel[6]] > cb) 1253 | if( p[pixel[4]] > cb) 1254 | if( p[pixel[5]] > cb) 1255 | if( p[pixel[7]] > cb) 1256 | if( p[pixel[8]] > cb) 1257 | if( p[pixel[9]] > cb) 1258 | if( p[pixel[10]] > cb) 1259 | if( p[pixel[11]] > cb) 1260 | if( p[pixel[12]] > cb) 1261 | if( p[pixel[13]] > cb) 1262 | if( p[pixel[14]] > cb) 1263 | if( p[pixel[3]] > cb) 1264 | goto is_a_corner; 1265 | else 1266 | if( p[pixel[15]] > cb) 1267 | goto is_a_corner; 1268 | else 1269 | goto is_not_a_corner; 1270 | else 1271 | goto is_not_a_corner; 1272 | else 1273 | goto is_not_a_corner; 1274 | else 1275 | goto is_not_a_corner; 1276 | else 1277 | goto is_not_a_corner; 1278 | else 1279 | goto is_not_a_corner; 1280 | else 1281 | goto is_not_a_corner; 1282 | else 1283 | goto is_not_a_corner; 1284 | else 1285 | goto is_not_a_corner; 1286 | else 1287 | goto is_not_a_corner; 1288 | else 1289 | goto is_not_a_corner; 1290 | else if( p[pixel[6]] < c_b) 1291 | if( p[pixel[7]] < c_b) 1292 | if( p[pixel[8]] < c_b) 1293 | if( p[pixel[9]] < c_b) 1294 | if( p[pixel[10]] < c_b) 1295 | if( p[pixel[11]] < c_b) 1296 | if( p[pixel[12]] < c_b) 1297 | if( p[pixel[13]] < c_b) 1298 | if( p[pixel[14]] < c_b) 1299 | if( p[pixel[15]] < c_b) 1300 | goto is_a_corner; 1301 | else 1302 | if( p[pixel[3]] < c_b) 1303 | if( p[pixel[4]] < c_b) 1304 | if( p[pixel[5]] < c_b) 1305 | goto is_a_corner; 1306 | else 1307 | goto is_not_a_corner; 1308 | else 1309 | goto is_not_a_corner; 1310 | else 1311 | goto is_not_a_corner; 1312 | else 1313 | goto is_not_a_corner; 1314 | else 1315 | goto is_not_a_corner; 1316 | else 1317 | goto is_not_a_corner; 1318 | else 1319 | goto is_not_a_corner; 1320 | else 1321 | goto is_not_a_corner; 1322 | else 1323 | goto is_not_a_corner; 1324 | else 1325 | goto is_not_a_corner; 1326 | else 1327 | goto is_not_a_corner; 1328 | else 1329 | goto is_not_a_corner; 1330 | else 1331 | if( p[pixel[5]] > cb) 1332 | if( p[pixel[4]] > cb) 1333 | if( p[pixel[6]] > cb) 1334 | if( p[pixel[7]] > cb) 1335 | if( p[pixel[8]] > cb) 1336 | if( p[pixel[9]] > cb) 1337 | if( p[pixel[10]] > cb) 1338 | if( p[pixel[11]] > cb) 1339 | if( p[pixel[12]] > cb) 1340 | if( p[pixel[13]] > cb) 1341 | if( p[pixel[3]] > cb) 1342 | if( p[pixel[2]] > cb) 1343 | goto is_a_corner; 1344 | else 1345 | if( p[pixel[14]] > cb) 1346 | goto is_a_corner; 1347 | else 1348 | goto is_not_a_corner; 1349 | else 1350 | if( p[pixel[14]] > cb) 1351 | if( p[pixel[15]] > cb) 1352 | goto is_a_corner; 1353 | else 1354 | goto is_not_a_corner; 1355 | else 1356 | goto is_not_a_corner; 1357 | else 1358 | goto is_not_a_corner; 1359 | else 1360 | goto is_not_a_corner; 1361 | else 1362 | goto is_not_a_corner; 1363 | else 1364 | goto is_not_a_corner; 1365 | else 1366 | goto is_not_a_corner; 1367 | else 1368 | goto is_not_a_corner; 1369 | else 1370 | goto is_not_a_corner; 1371 | else 1372 | goto is_not_a_corner; 1373 | else 1374 | goto is_not_a_corner; 1375 | else if( p[pixel[5]] < c_b) 1376 | if( p[pixel[6]] < c_b) 1377 | if( p[pixel[7]] < c_b) 1378 | if( p[pixel[8]] < c_b) 1379 | if( p[pixel[9]] < c_b) 1380 | if( p[pixel[10]] < c_b) 1381 | if( p[pixel[11]] < c_b) 1382 | if( p[pixel[12]] < c_b) 1383 | if( p[pixel[13]] < c_b) 1384 | if( p[pixel[14]] < c_b) 1385 | if( p[pixel[15]] < c_b) 1386 | goto is_a_corner; 1387 | else 1388 | if( p[pixel[3]] < c_b) 1389 | if( p[pixel[4]] < c_b) 1390 | goto is_a_corner; 1391 | else 1392 | goto is_not_a_corner; 1393 | else 1394 | goto is_not_a_corner; 1395 | else 1396 | if( p[pixel[2]] < c_b) 1397 | if( p[pixel[3]] < c_b) 1398 | if( p[pixel[4]] < c_b) 1399 | goto is_a_corner; 1400 | else 1401 | goto is_not_a_corner; 1402 | else 1403 | goto is_not_a_corner; 1404 | else 1405 | goto is_not_a_corner; 1406 | else 1407 | goto is_not_a_corner; 1408 | else 1409 | goto is_not_a_corner; 1410 | else 1411 | goto is_not_a_corner; 1412 | else 1413 | goto is_not_a_corner; 1414 | else 1415 | goto is_not_a_corner; 1416 | else 1417 | goto is_not_a_corner; 1418 | else 1419 | goto is_not_a_corner; 1420 | else 1421 | goto is_not_a_corner; 1422 | else 1423 | goto is_not_a_corner; 1424 | else 1425 | if( p[pixel[4]] > cb) 1426 | if( p[pixel[5]] > cb) 1427 | if( p[pixel[6]] > cb) 1428 | if( p[pixel[7]] > cb) 1429 | if( p[pixel[8]] > cb) 1430 | if( p[pixel[9]] > cb) 1431 | if( p[pixel[10]] > cb) 1432 | if( p[pixel[11]] > cb) 1433 | if( p[pixel[12]] > cb) 1434 | if( p[pixel[3]] > cb) 1435 | if( p[pixel[2]] > cb) 1436 | if( p[pixel[1]] > cb) 1437 | goto is_a_corner; 1438 | else 1439 | if( p[pixel[13]] > cb) 1440 | goto is_a_corner; 1441 | else 1442 | goto is_not_a_corner; 1443 | else 1444 | if( p[pixel[13]] > cb) 1445 | if( p[pixel[14]] > cb) 1446 | goto is_a_corner; 1447 | else 1448 | goto is_not_a_corner; 1449 | else 1450 | goto is_not_a_corner; 1451 | else 1452 | if( p[pixel[13]] > cb) 1453 | if( p[pixel[14]] > cb) 1454 | if( p[pixel[15]] > cb) 1455 | goto is_a_corner; 1456 | else 1457 | goto is_not_a_corner; 1458 | else 1459 | goto is_not_a_corner; 1460 | else 1461 | goto is_not_a_corner; 1462 | else 1463 | goto is_not_a_corner; 1464 | else 1465 | goto is_not_a_corner; 1466 | else 1467 | goto is_not_a_corner; 1468 | else 1469 | goto is_not_a_corner; 1470 | else 1471 | goto is_not_a_corner; 1472 | else 1473 | goto is_not_a_corner; 1474 | else 1475 | goto is_not_a_corner; 1476 | else 1477 | goto is_not_a_corner; 1478 | else if( p[pixel[4]] < c_b) 1479 | if( p[pixel[5]] < c_b) 1480 | if( p[pixel[6]] < c_b) 1481 | if( p[pixel[7]] < c_b) 1482 | if( p[pixel[8]] < c_b) 1483 | if( p[pixel[9]] < c_b) 1484 | if( p[pixel[10]] < c_b) 1485 | if( p[pixel[11]] < c_b) 1486 | if( p[pixel[12]] < c_b) 1487 | if( p[pixel[3]] < c_b) 1488 | if( p[pixel[2]] < c_b) 1489 | if( p[pixel[1]] < c_b) 1490 | goto is_a_corner; 1491 | else 1492 | if( p[pixel[13]] < c_b) 1493 | goto is_a_corner; 1494 | else 1495 | goto is_not_a_corner; 1496 | else 1497 | if( p[pixel[13]] < c_b) 1498 | if( p[pixel[14]] < c_b) 1499 | goto is_a_corner; 1500 | else 1501 | goto is_not_a_corner; 1502 | else 1503 | goto is_not_a_corner; 1504 | else 1505 | if( p[pixel[13]] < c_b) 1506 | if( p[pixel[14]] < c_b) 1507 | if( p[pixel[15]] < c_b) 1508 | goto is_a_corner; 1509 | else 1510 | goto is_not_a_corner; 1511 | else 1512 | goto is_not_a_corner; 1513 | else 1514 | goto is_not_a_corner; 1515 | else 1516 | goto is_not_a_corner; 1517 | else 1518 | goto is_not_a_corner; 1519 | else 1520 | goto is_not_a_corner; 1521 | else 1522 | goto is_not_a_corner; 1523 | else 1524 | goto is_not_a_corner; 1525 | else 1526 | goto is_not_a_corner; 1527 | else 1528 | goto is_not_a_corner; 1529 | else 1530 | goto is_not_a_corner; 1531 | else 1532 | goto is_not_a_corner; 1533 | 1534 | is_a_corner: 1535 | bmin=b; 1536 | goto end_if; 1537 | 1538 | is_not_a_corner: 1539 | bmax=b; 1540 | goto end_if; 1541 | 1542 | end_if: 1543 | 1544 | if(bmin == bmax - 1 || bmin == bmax) 1545 | return bmin; 1546 | b = (bmin + bmax) / 2; 1547 | } 1548 | } 1549 | 1550 | static void make_offsets(int pixel[], int row_stride) 1551 | { 1552 | pixel[0] = 0 + row_stride * 3; 1553 | pixel[1] = 1 + row_stride * 3; 1554 | pixel[2] = 2 + row_stride * 2; 1555 | pixel[3] = 3 + row_stride * 1; 1556 | pixel[4] = 3 + row_stride * 0; 1557 | pixel[5] = 3 + row_stride * -1; 1558 | pixel[6] = 2 + row_stride * -2; 1559 | pixel[7] = 1 + row_stride * -3; 1560 | pixel[8] = 0 + row_stride * -3; 1561 | pixel[9] = -1 + row_stride * -3; 1562 | pixel[10] = -2 + row_stride * -2; 1563 | pixel[11] = -3 + row_stride * -1; 1564 | pixel[12] = -3 + row_stride * 0; 1565 | pixel[13] = -3 + row_stride * 1; 1566 | pixel[14] = -2 + row_stride * 2; 1567 | pixel[15] = -1 + row_stride * 3; 1568 | } 1569 | 1570 | 1571 | 1572 | int* fast12_score(const byte* i, int stride, xy* corners, int num_corners, int b) 1573 | { 1574 | int* scores = (int*)malloc(sizeof(int)* num_corners); 1575 | int n; 1576 | 1577 | int pixel[16]; 1578 | make_offsets(pixel, stride); 1579 | 1580 | for(n=0; n < num_corners; n++) 1581 | scores[n] = fast12_corner_score(i + corners[n].y*stride + corners[n].x, pixel, b); 1582 | 1583 | return scores; 1584 | } 1585 | 1586 | 1587 | xy* fast12_detect(const byte* im, int xsize, int ysize, int stride, int b, int* ret_num_corners) 1588 | { 1589 | int num_corners=0; 1590 | xy* ret_corners; 1591 | int rsize=512; 1592 | int pixel[16]; 1593 | int x, y; 1594 | 1595 | ret_corners = (xy*)malloc(sizeof(xy)*rsize); 1596 | make_offsets(pixel, stride); 1597 | 1598 | for(y=3; y < ysize - 3; y++) 1599 | for(x=3; x < xsize - 3; x++) 1600 | { 1601 | const byte* p = im + y*stride + x; 1602 | 1603 | int cb = *p + b; 1604 | int c_b= *p - b; 1605 | if(p[pixel[0]] > cb) 1606 | if(p[pixel[1]] > cb) 1607 | if(p[pixel[2]] > cb) 1608 | if(p[pixel[3]] > cb) 1609 | if(p[pixel[4]] > cb) 1610 | if(p[pixel[5]] > cb) 1611 | if(p[pixel[6]] > cb) 1612 | if(p[pixel[7]] > cb) 1613 | if(p[pixel[8]] > cb) 1614 | if(p[pixel[9]] > cb) 1615 | if(p[pixel[10]] > cb) 1616 | if(p[pixel[11]] > cb) 1617 | {} 1618 | else 1619 | if(p[pixel[15]] > cb) 1620 | {} 1621 | else 1622 | continue; 1623 | else 1624 | if(p[pixel[14]] > cb) 1625 | if(p[pixel[15]] > cb) 1626 | {} 1627 | else 1628 | continue; 1629 | else 1630 | continue; 1631 | else 1632 | if(p[pixel[13]] > cb) 1633 | if(p[pixel[14]] > cb) 1634 | if(p[pixel[15]] > cb) 1635 | {} 1636 | else 1637 | continue; 1638 | else 1639 | continue; 1640 | else 1641 | continue; 1642 | else 1643 | if(p[pixel[12]] > cb) 1644 | if(p[pixel[13]] > cb) 1645 | if(p[pixel[14]] > cb) 1646 | if(p[pixel[15]] > cb) 1647 | {} 1648 | else 1649 | continue; 1650 | else 1651 | continue; 1652 | else 1653 | continue; 1654 | else 1655 | continue; 1656 | else 1657 | if(p[pixel[11]] > cb) 1658 | if(p[pixel[12]] > cb) 1659 | if(p[pixel[13]] > cb) 1660 | if(p[pixel[14]] > cb) 1661 | if(p[pixel[15]] > cb) 1662 | {} 1663 | else 1664 | continue; 1665 | else 1666 | continue; 1667 | else 1668 | continue; 1669 | else 1670 | continue; 1671 | else 1672 | continue; 1673 | else 1674 | if(p[pixel[10]] > cb) 1675 | if(p[pixel[11]] > cb) 1676 | if(p[pixel[12]] > cb) 1677 | if(p[pixel[13]] > cb) 1678 | if(p[pixel[14]] > cb) 1679 | if(p[pixel[15]] > cb) 1680 | {} 1681 | else 1682 | continue; 1683 | else 1684 | continue; 1685 | else 1686 | continue; 1687 | else 1688 | continue; 1689 | else 1690 | continue; 1691 | else 1692 | continue; 1693 | else 1694 | if(p[pixel[9]] > cb) 1695 | if(p[pixel[10]] > cb) 1696 | if(p[pixel[11]] > cb) 1697 | if(p[pixel[12]] > cb) 1698 | if(p[pixel[13]] > cb) 1699 | if(p[pixel[14]] > cb) 1700 | if(p[pixel[15]] > cb) 1701 | {} 1702 | else 1703 | continue; 1704 | else 1705 | continue; 1706 | else 1707 | continue; 1708 | else 1709 | continue; 1710 | else 1711 | continue; 1712 | else 1713 | continue; 1714 | else 1715 | continue; 1716 | else if(p[pixel[4]] < c_b) 1717 | if(p[pixel[8]] > cb) 1718 | if(p[pixel[9]] > cb) 1719 | if(p[pixel[10]] > cb) 1720 | if(p[pixel[11]] > cb) 1721 | if(p[pixel[12]] > cb) 1722 | if(p[pixel[13]] > cb) 1723 | if(p[pixel[14]] > cb) 1724 | if(p[pixel[15]] > cb) 1725 | {} 1726 | else 1727 | continue; 1728 | else 1729 | continue; 1730 | else 1731 | continue; 1732 | else 1733 | continue; 1734 | else 1735 | continue; 1736 | else 1737 | continue; 1738 | else 1739 | continue; 1740 | else if(p[pixel[8]] < c_b) 1741 | if(p[pixel[5]] < c_b) 1742 | if(p[pixel[6]] < c_b) 1743 | if(p[pixel[7]] < c_b) 1744 | if(p[pixel[9]] < c_b) 1745 | if(p[pixel[10]] < c_b) 1746 | if(p[pixel[11]] < c_b) 1747 | if(p[pixel[12]] < c_b) 1748 | if(p[pixel[13]] < c_b) 1749 | if(p[pixel[14]] < c_b) 1750 | if(p[pixel[15]] < c_b) 1751 | {} 1752 | else 1753 | continue; 1754 | else 1755 | continue; 1756 | else 1757 | continue; 1758 | else 1759 | continue; 1760 | else 1761 | continue; 1762 | else 1763 | continue; 1764 | else 1765 | continue; 1766 | else 1767 | continue; 1768 | else 1769 | continue; 1770 | else 1771 | continue; 1772 | else 1773 | continue; 1774 | else 1775 | if(p[pixel[8]] > cb) 1776 | if(p[pixel[9]] > cb) 1777 | if(p[pixel[10]] > cb) 1778 | if(p[pixel[11]] > cb) 1779 | if(p[pixel[12]] > cb) 1780 | if(p[pixel[13]] > cb) 1781 | if(p[pixel[14]] > cb) 1782 | if(p[pixel[15]] > cb) 1783 | {} 1784 | else 1785 | continue; 1786 | else 1787 | continue; 1788 | else 1789 | continue; 1790 | else 1791 | continue; 1792 | else 1793 | continue; 1794 | else 1795 | continue; 1796 | else 1797 | continue; 1798 | else 1799 | continue; 1800 | else if(p[pixel[3]] < c_b) 1801 | if(p[pixel[15]] > cb) 1802 | if(p[pixel[7]] > cb) 1803 | if(p[pixel[8]] > cb) 1804 | if(p[pixel[9]] > cb) 1805 | if(p[pixel[10]] > cb) 1806 | if(p[pixel[11]] > cb) 1807 | if(p[pixel[12]] > cb) 1808 | if(p[pixel[13]] > cb) 1809 | if(p[pixel[14]] > cb) 1810 | {} 1811 | else 1812 | continue; 1813 | else 1814 | continue; 1815 | else 1816 | continue; 1817 | else 1818 | continue; 1819 | else 1820 | continue; 1821 | else 1822 | continue; 1823 | else 1824 | continue; 1825 | else if(p[pixel[7]] < c_b) 1826 | if(p[pixel[4]] < c_b) 1827 | if(p[pixel[5]] < c_b) 1828 | if(p[pixel[6]] < c_b) 1829 | if(p[pixel[8]] < c_b) 1830 | if(p[pixel[9]] < c_b) 1831 | if(p[pixel[10]] < c_b) 1832 | if(p[pixel[11]] < c_b) 1833 | if(p[pixel[12]] < c_b) 1834 | if(p[pixel[13]] < c_b) 1835 | if(p[pixel[14]] < c_b) 1836 | {} 1837 | else 1838 | continue; 1839 | else 1840 | continue; 1841 | else 1842 | continue; 1843 | else 1844 | continue; 1845 | else 1846 | continue; 1847 | else 1848 | continue; 1849 | else 1850 | continue; 1851 | else 1852 | continue; 1853 | else 1854 | continue; 1855 | else 1856 | continue; 1857 | else 1858 | continue; 1859 | else 1860 | if(p[pixel[4]] < c_b) 1861 | if(p[pixel[5]] < c_b) 1862 | if(p[pixel[6]] < c_b) 1863 | if(p[pixel[7]] < c_b) 1864 | if(p[pixel[8]] < c_b) 1865 | if(p[pixel[9]] < c_b) 1866 | if(p[pixel[10]] < c_b) 1867 | if(p[pixel[11]] < c_b) 1868 | if(p[pixel[12]] < c_b) 1869 | if(p[pixel[13]] < c_b) 1870 | if(p[pixel[14]] < c_b) 1871 | {} 1872 | else 1873 | continue; 1874 | else 1875 | continue; 1876 | else 1877 | continue; 1878 | else 1879 | continue; 1880 | else 1881 | continue; 1882 | else 1883 | continue; 1884 | else 1885 | continue; 1886 | else 1887 | continue; 1888 | else 1889 | continue; 1890 | else 1891 | continue; 1892 | else 1893 | continue; 1894 | else 1895 | if(p[pixel[7]] > cb) 1896 | if(p[pixel[8]] > cb) 1897 | if(p[pixel[9]] > cb) 1898 | if(p[pixel[10]] > cb) 1899 | if(p[pixel[11]] > cb) 1900 | if(p[pixel[12]] > cb) 1901 | if(p[pixel[13]] > cb) 1902 | if(p[pixel[14]] > cb) 1903 | if(p[pixel[15]] > cb) 1904 | {} 1905 | else 1906 | continue; 1907 | else 1908 | continue; 1909 | else 1910 | continue; 1911 | else 1912 | continue; 1913 | else 1914 | continue; 1915 | else 1916 | continue; 1917 | else 1918 | continue; 1919 | else 1920 | continue; 1921 | else if(p[pixel[7]] < c_b) 1922 | if(p[pixel[4]] < c_b) 1923 | if(p[pixel[5]] < c_b) 1924 | if(p[pixel[6]] < c_b) 1925 | if(p[pixel[8]] < c_b) 1926 | if(p[pixel[9]] < c_b) 1927 | if(p[pixel[10]] < c_b) 1928 | if(p[pixel[11]] < c_b) 1929 | if(p[pixel[12]] < c_b) 1930 | if(p[pixel[13]] < c_b) 1931 | if(p[pixel[14]] < c_b) 1932 | if(p[pixel[15]] < c_b) 1933 | {} 1934 | else 1935 | continue; 1936 | else 1937 | continue; 1938 | else 1939 | continue; 1940 | else 1941 | continue; 1942 | else 1943 | continue; 1944 | else 1945 | continue; 1946 | else 1947 | continue; 1948 | else 1949 | continue; 1950 | else 1951 | continue; 1952 | else 1953 | continue; 1954 | else 1955 | continue; 1956 | else 1957 | continue; 1958 | else if(p[pixel[2]] < c_b) 1959 | if(p[pixel[6]] > cb) 1960 | if(p[pixel[7]] > cb) 1961 | if(p[pixel[8]] > cb) 1962 | if(p[pixel[9]] > cb) 1963 | if(p[pixel[10]] > cb) 1964 | if(p[pixel[11]] > cb) 1965 | if(p[pixel[12]] > cb) 1966 | if(p[pixel[13]] > cb) 1967 | if(p[pixel[14]] > cb) 1968 | if(p[pixel[15]] > cb) 1969 | {} 1970 | else 1971 | if(p[pixel[3]] > cb) 1972 | if(p[pixel[4]] > cb) 1973 | if(p[pixel[5]] > cb) 1974 | {} 1975 | else 1976 | continue; 1977 | else 1978 | continue; 1979 | else 1980 | continue; 1981 | else 1982 | continue; 1983 | else 1984 | continue; 1985 | else 1986 | continue; 1987 | else 1988 | continue; 1989 | else 1990 | continue; 1991 | else 1992 | continue; 1993 | else 1994 | continue; 1995 | else 1996 | continue; 1997 | else if(p[pixel[6]] < c_b) 1998 | if(p[pixel[4]] < c_b) 1999 | if(p[pixel[5]] < c_b) 2000 | if(p[pixel[7]] < c_b) 2001 | if(p[pixel[8]] < c_b) 2002 | if(p[pixel[9]] < c_b) 2003 | if(p[pixel[10]] < c_b) 2004 | if(p[pixel[11]] < c_b) 2005 | if(p[pixel[12]] < c_b) 2006 | if(p[pixel[13]] < c_b) 2007 | if(p[pixel[3]] < c_b) 2008 | {} 2009 | else 2010 | if(p[pixel[14]] < c_b) 2011 | if(p[pixel[15]] < c_b) 2012 | {} 2013 | else 2014 | continue; 2015 | else 2016 | continue; 2017 | else 2018 | continue; 2019 | else 2020 | continue; 2021 | else 2022 | continue; 2023 | else 2024 | continue; 2025 | else 2026 | continue; 2027 | else 2028 | continue; 2029 | else 2030 | continue; 2031 | else 2032 | continue; 2033 | else 2034 | continue; 2035 | else 2036 | continue; 2037 | else 2038 | if(p[pixel[6]] > cb) 2039 | if(p[pixel[7]] > cb) 2040 | if(p[pixel[8]] > cb) 2041 | if(p[pixel[9]] > cb) 2042 | if(p[pixel[10]] > cb) 2043 | if(p[pixel[11]] > cb) 2044 | if(p[pixel[12]] > cb) 2045 | if(p[pixel[13]] > cb) 2046 | if(p[pixel[14]] > cb) 2047 | if(p[pixel[15]] > cb) 2048 | {} 2049 | else 2050 | if(p[pixel[3]] > cb) 2051 | if(p[pixel[4]] > cb) 2052 | if(p[pixel[5]] > cb) 2053 | {} 2054 | else 2055 | continue; 2056 | else 2057 | continue; 2058 | else 2059 | continue; 2060 | else 2061 | continue; 2062 | else 2063 | continue; 2064 | else 2065 | continue; 2066 | else 2067 | continue; 2068 | else 2069 | continue; 2070 | else 2071 | continue; 2072 | else 2073 | continue; 2074 | else 2075 | continue; 2076 | else if(p[pixel[6]] < c_b) 2077 | if(p[pixel[4]] < c_b) 2078 | if(p[pixel[5]] < c_b) 2079 | if(p[pixel[7]] < c_b) 2080 | if(p[pixel[8]] < c_b) 2081 | if(p[pixel[9]] < c_b) 2082 | if(p[pixel[10]] < c_b) 2083 | if(p[pixel[11]] < c_b) 2084 | if(p[pixel[12]] < c_b) 2085 | if(p[pixel[13]] < c_b) 2086 | if(p[pixel[14]] < c_b) 2087 | if(p[pixel[3]] < c_b) 2088 | {} 2089 | else 2090 | if(p[pixel[15]] < c_b) 2091 | {} 2092 | else 2093 | continue; 2094 | else 2095 | continue; 2096 | else 2097 | continue; 2098 | else 2099 | continue; 2100 | else 2101 | continue; 2102 | else 2103 | continue; 2104 | else 2105 | continue; 2106 | else 2107 | continue; 2108 | else 2109 | continue; 2110 | else 2111 | continue; 2112 | else 2113 | continue; 2114 | else 2115 | continue; 2116 | else if(p[pixel[1]] < c_b) 2117 | if(p[pixel[5]] > cb) 2118 | if(p[pixel[6]] > cb) 2119 | if(p[pixel[7]] > cb) 2120 | if(p[pixel[8]] > cb) 2121 | if(p[pixel[9]] > cb) 2122 | if(p[pixel[10]] > cb) 2123 | if(p[pixel[11]] > cb) 2124 | if(p[pixel[12]] > cb) 2125 | if(p[pixel[13]] > cb) 2126 | if(p[pixel[14]] > cb) 2127 | if(p[pixel[15]] > cb) 2128 | {} 2129 | else 2130 | if(p[pixel[3]] > cb) 2131 | if(p[pixel[4]] > cb) 2132 | {} 2133 | else 2134 | continue; 2135 | else 2136 | continue; 2137 | else 2138 | if(p[pixel[2]] > cb) 2139 | if(p[pixel[3]] > cb) 2140 | if(p[pixel[4]] > cb) 2141 | {} 2142 | else 2143 | continue; 2144 | else 2145 | continue; 2146 | else 2147 | continue; 2148 | else 2149 | continue; 2150 | else 2151 | continue; 2152 | else 2153 | continue; 2154 | else 2155 | continue; 2156 | else 2157 | continue; 2158 | else 2159 | continue; 2160 | else 2161 | continue; 2162 | else 2163 | continue; 2164 | else if(p[pixel[5]] < c_b) 2165 | if(p[pixel[4]] < c_b) 2166 | if(p[pixel[6]] < c_b) 2167 | if(p[pixel[7]] < c_b) 2168 | if(p[pixel[8]] < c_b) 2169 | if(p[pixel[9]] < c_b) 2170 | if(p[pixel[10]] < c_b) 2171 | if(p[pixel[11]] < c_b) 2172 | if(p[pixel[12]] < c_b) 2173 | if(p[pixel[3]] < c_b) 2174 | if(p[pixel[2]] < c_b) 2175 | {} 2176 | else 2177 | if(p[pixel[13]] < c_b) 2178 | if(p[pixel[14]] < c_b) 2179 | {} 2180 | else 2181 | continue; 2182 | else 2183 | continue; 2184 | else 2185 | if(p[pixel[13]] < c_b) 2186 | if(p[pixel[14]] < c_b) 2187 | if(p[pixel[15]] < c_b) 2188 | {} 2189 | else 2190 | continue; 2191 | else 2192 | continue; 2193 | else 2194 | continue; 2195 | else 2196 | continue; 2197 | else 2198 | continue; 2199 | else 2200 | continue; 2201 | else 2202 | continue; 2203 | else 2204 | continue; 2205 | else 2206 | continue; 2207 | else 2208 | continue; 2209 | else 2210 | continue; 2211 | else 2212 | continue; 2213 | else 2214 | if(p[pixel[5]] > cb) 2215 | if(p[pixel[6]] > cb) 2216 | if(p[pixel[7]] > cb) 2217 | if(p[pixel[8]] > cb) 2218 | if(p[pixel[9]] > cb) 2219 | if(p[pixel[10]] > cb) 2220 | if(p[pixel[11]] > cb) 2221 | if(p[pixel[12]] > cb) 2222 | if(p[pixel[13]] > cb) 2223 | if(p[pixel[14]] > cb) 2224 | if(p[pixel[15]] > cb) 2225 | {} 2226 | else 2227 | if(p[pixel[3]] > cb) 2228 | if(p[pixel[4]] > cb) 2229 | {} 2230 | else 2231 | continue; 2232 | else 2233 | continue; 2234 | else 2235 | if(p[pixel[2]] > cb) 2236 | if(p[pixel[3]] > cb) 2237 | if(p[pixel[4]] > cb) 2238 | {} 2239 | else 2240 | continue; 2241 | else 2242 | continue; 2243 | else 2244 | continue; 2245 | else 2246 | continue; 2247 | else 2248 | continue; 2249 | else 2250 | continue; 2251 | else 2252 | continue; 2253 | else 2254 | continue; 2255 | else 2256 | continue; 2257 | else 2258 | continue; 2259 | else 2260 | continue; 2261 | else if(p[pixel[5]] < c_b) 2262 | if(p[pixel[4]] < c_b) 2263 | if(p[pixel[6]] < c_b) 2264 | if(p[pixel[7]] < c_b) 2265 | if(p[pixel[8]] < c_b) 2266 | if(p[pixel[9]] < c_b) 2267 | if(p[pixel[10]] < c_b) 2268 | if(p[pixel[11]] < c_b) 2269 | if(p[pixel[12]] < c_b) 2270 | if(p[pixel[13]] < c_b) 2271 | if(p[pixel[3]] < c_b) 2272 | if(p[pixel[2]] < c_b) 2273 | {} 2274 | else 2275 | if(p[pixel[14]] < c_b) 2276 | {} 2277 | else 2278 | continue; 2279 | else 2280 | if(p[pixel[14]] < c_b) 2281 | if(p[pixel[15]] < c_b) 2282 | {} 2283 | else 2284 | continue; 2285 | else 2286 | continue; 2287 | else 2288 | continue; 2289 | else 2290 | continue; 2291 | else 2292 | continue; 2293 | else 2294 | continue; 2295 | else 2296 | continue; 2297 | else 2298 | continue; 2299 | else 2300 | continue; 2301 | else 2302 | continue; 2303 | else 2304 | continue; 2305 | else 2306 | continue; 2307 | else if(p[pixel[0]] < c_b) 2308 | if(p[pixel[1]] > cb) 2309 | if(p[pixel[5]] > cb) 2310 | if(p[pixel[4]] > cb) 2311 | if(p[pixel[6]] > cb) 2312 | if(p[pixel[7]] > cb) 2313 | if(p[pixel[8]] > cb) 2314 | if(p[pixel[9]] > cb) 2315 | if(p[pixel[10]] > cb) 2316 | if(p[pixel[11]] > cb) 2317 | if(p[pixel[12]] > cb) 2318 | if(p[pixel[3]] > cb) 2319 | if(p[pixel[2]] > cb) 2320 | {} 2321 | else 2322 | if(p[pixel[13]] > cb) 2323 | if(p[pixel[14]] > cb) 2324 | {} 2325 | else 2326 | continue; 2327 | else 2328 | continue; 2329 | else 2330 | if(p[pixel[13]] > cb) 2331 | if(p[pixel[14]] > cb) 2332 | if(p[pixel[15]] > cb) 2333 | {} 2334 | else 2335 | continue; 2336 | else 2337 | continue; 2338 | else 2339 | continue; 2340 | else 2341 | continue; 2342 | else 2343 | continue; 2344 | else 2345 | continue; 2346 | else 2347 | continue; 2348 | else 2349 | continue; 2350 | else 2351 | continue; 2352 | else 2353 | continue; 2354 | else 2355 | continue; 2356 | else if(p[pixel[5]] < c_b) 2357 | if(p[pixel[6]] < c_b) 2358 | if(p[pixel[7]] < c_b) 2359 | if(p[pixel[8]] < c_b) 2360 | if(p[pixel[9]] < c_b) 2361 | if(p[pixel[10]] < c_b) 2362 | if(p[pixel[11]] < c_b) 2363 | if(p[pixel[12]] < c_b) 2364 | if(p[pixel[13]] < c_b) 2365 | if(p[pixel[14]] < c_b) 2366 | if(p[pixel[15]] < c_b) 2367 | {} 2368 | else 2369 | if(p[pixel[3]] < c_b) 2370 | if(p[pixel[4]] < c_b) 2371 | {} 2372 | else 2373 | continue; 2374 | else 2375 | continue; 2376 | else 2377 | if(p[pixel[2]] < c_b) 2378 | if(p[pixel[3]] < c_b) 2379 | if(p[pixel[4]] < c_b) 2380 | {} 2381 | else 2382 | continue; 2383 | else 2384 | continue; 2385 | else 2386 | continue; 2387 | else 2388 | continue; 2389 | else 2390 | continue; 2391 | else 2392 | continue; 2393 | else 2394 | continue; 2395 | else 2396 | continue; 2397 | else 2398 | continue; 2399 | else 2400 | continue; 2401 | else 2402 | continue; 2403 | else 2404 | continue; 2405 | else if(p[pixel[1]] < c_b) 2406 | if(p[pixel[2]] > cb) 2407 | if(p[pixel[6]] > cb) 2408 | if(p[pixel[4]] > cb) 2409 | if(p[pixel[5]] > cb) 2410 | if(p[pixel[7]] > cb) 2411 | if(p[pixel[8]] > cb) 2412 | if(p[pixel[9]] > cb) 2413 | if(p[pixel[10]] > cb) 2414 | if(p[pixel[11]] > cb) 2415 | if(p[pixel[12]] > cb) 2416 | if(p[pixel[13]] > cb) 2417 | if(p[pixel[3]] > cb) 2418 | {} 2419 | else 2420 | if(p[pixel[14]] > cb) 2421 | if(p[pixel[15]] > cb) 2422 | {} 2423 | else 2424 | continue; 2425 | else 2426 | continue; 2427 | else 2428 | continue; 2429 | else 2430 | continue; 2431 | else 2432 | continue; 2433 | else 2434 | continue; 2435 | else 2436 | continue; 2437 | else 2438 | continue; 2439 | else 2440 | continue; 2441 | else 2442 | continue; 2443 | else 2444 | continue; 2445 | else if(p[pixel[6]] < c_b) 2446 | if(p[pixel[7]] < c_b) 2447 | if(p[pixel[8]] < c_b) 2448 | if(p[pixel[9]] < c_b) 2449 | if(p[pixel[10]] < c_b) 2450 | if(p[pixel[11]] < c_b) 2451 | if(p[pixel[12]] < c_b) 2452 | if(p[pixel[13]] < c_b) 2453 | if(p[pixel[14]] < c_b) 2454 | if(p[pixel[15]] < c_b) 2455 | {} 2456 | else 2457 | if(p[pixel[3]] < c_b) 2458 | if(p[pixel[4]] < c_b) 2459 | if(p[pixel[5]] < c_b) 2460 | {} 2461 | else 2462 | continue; 2463 | else 2464 | continue; 2465 | else 2466 | continue; 2467 | else 2468 | continue; 2469 | else 2470 | continue; 2471 | else 2472 | continue; 2473 | else 2474 | continue; 2475 | else 2476 | continue; 2477 | else 2478 | continue; 2479 | else 2480 | continue; 2481 | else 2482 | continue; 2483 | else 2484 | continue; 2485 | else if(p[pixel[2]] < c_b) 2486 | if(p[pixel[3]] > cb) 2487 | if(p[pixel[15]] < c_b) 2488 | if(p[pixel[7]] > cb) 2489 | if(p[pixel[4]] > cb) 2490 | if(p[pixel[5]] > cb) 2491 | if(p[pixel[6]] > cb) 2492 | if(p[pixel[8]] > cb) 2493 | if(p[pixel[9]] > cb) 2494 | if(p[pixel[10]] > cb) 2495 | if(p[pixel[11]] > cb) 2496 | if(p[pixel[12]] > cb) 2497 | if(p[pixel[13]] > cb) 2498 | if(p[pixel[14]] > cb) 2499 | {} 2500 | else 2501 | continue; 2502 | else 2503 | continue; 2504 | else 2505 | continue; 2506 | else 2507 | continue; 2508 | else 2509 | continue; 2510 | else 2511 | continue; 2512 | else 2513 | continue; 2514 | else 2515 | continue; 2516 | else 2517 | continue; 2518 | else 2519 | continue; 2520 | else if(p[pixel[7]] < c_b) 2521 | if(p[pixel[8]] < c_b) 2522 | if(p[pixel[9]] < c_b) 2523 | if(p[pixel[10]] < c_b) 2524 | if(p[pixel[11]] < c_b) 2525 | if(p[pixel[12]] < c_b) 2526 | if(p[pixel[13]] < c_b) 2527 | if(p[pixel[14]] < c_b) 2528 | {} 2529 | else 2530 | continue; 2531 | else 2532 | continue; 2533 | else 2534 | continue; 2535 | else 2536 | continue; 2537 | else 2538 | continue; 2539 | else 2540 | continue; 2541 | else 2542 | continue; 2543 | else 2544 | continue; 2545 | else 2546 | if(p[pixel[4]] > cb) 2547 | if(p[pixel[5]] > cb) 2548 | if(p[pixel[6]] > cb) 2549 | if(p[pixel[7]] > cb) 2550 | if(p[pixel[8]] > cb) 2551 | if(p[pixel[9]] > cb) 2552 | if(p[pixel[10]] > cb) 2553 | if(p[pixel[11]] > cb) 2554 | if(p[pixel[12]] > cb) 2555 | if(p[pixel[13]] > cb) 2556 | if(p[pixel[14]] > cb) 2557 | {} 2558 | else 2559 | continue; 2560 | else 2561 | continue; 2562 | else 2563 | continue; 2564 | else 2565 | continue; 2566 | else 2567 | continue; 2568 | else 2569 | continue; 2570 | else 2571 | continue; 2572 | else 2573 | continue; 2574 | else 2575 | continue; 2576 | else 2577 | continue; 2578 | else 2579 | continue; 2580 | else if(p[pixel[3]] < c_b) 2581 | if(p[pixel[4]] > cb) 2582 | if(p[pixel[8]] > cb) 2583 | if(p[pixel[5]] > cb) 2584 | if(p[pixel[6]] > cb) 2585 | if(p[pixel[7]] > cb) 2586 | if(p[pixel[9]] > cb) 2587 | if(p[pixel[10]] > cb) 2588 | if(p[pixel[11]] > cb) 2589 | if(p[pixel[12]] > cb) 2590 | if(p[pixel[13]] > cb) 2591 | if(p[pixel[14]] > cb) 2592 | if(p[pixel[15]] > cb) 2593 | {} 2594 | else 2595 | continue; 2596 | else 2597 | continue; 2598 | else 2599 | continue; 2600 | else 2601 | continue; 2602 | else 2603 | continue; 2604 | else 2605 | continue; 2606 | else 2607 | continue; 2608 | else 2609 | continue; 2610 | else 2611 | continue; 2612 | else 2613 | continue; 2614 | else if(p[pixel[8]] < c_b) 2615 | if(p[pixel[9]] < c_b) 2616 | if(p[pixel[10]] < c_b) 2617 | if(p[pixel[11]] < c_b) 2618 | if(p[pixel[12]] < c_b) 2619 | if(p[pixel[13]] < c_b) 2620 | if(p[pixel[14]] < c_b) 2621 | if(p[pixel[15]] < c_b) 2622 | {} 2623 | else 2624 | continue; 2625 | else 2626 | continue; 2627 | else 2628 | continue; 2629 | else 2630 | continue; 2631 | else 2632 | continue; 2633 | else 2634 | continue; 2635 | else 2636 | continue; 2637 | else 2638 | continue; 2639 | else if(p[pixel[4]] < c_b) 2640 | if(p[pixel[5]] < c_b) 2641 | if(p[pixel[6]] < c_b) 2642 | if(p[pixel[7]] < c_b) 2643 | if(p[pixel[8]] < c_b) 2644 | if(p[pixel[9]] < c_b) 2645 | if(p[pixel[10]] < c_b) 2646 | if(p[pixel[11]] < c_b) 2647 | {} 2648 | else 2649 | if(p[pixel[15]] < c_b) 2650 | {} 2651 | else 2652 | continue; 2653 | else 2654 | if(p[pixel[14]] < c_b) 2655 | if(p[pixel[15]] < c_b) 2656 | {} 2657 | else 2658 | continue; 2659 | else 2660 | continue; 2661 | else 2662 | if(p[pixel[13]] < c_b) 2663 | if(p[pixel[14]] < c_b) 2664 | if(p[pixel[15]] < c_b) 2665 | {} 2666 | else 2667 | continue; 2668 | else 2669 | continue; 2670 | else 2671 | continue; 2672 | else 2673 | if(p[pixel[12]] < c_b) 2674 | if(p[pixel[13]] < c_b) 2675 | if(p[pixel[14]] < c_b) 2676 | if(p[pixel[15]] < c_b) 2677 | {} 2678 | else 2679 | continue; 2680 | else 2681 | continue; 2682 | else 2683 | continue; 2684 | else 2685 | continue; 2686 | else 2687 | if(p[pixel[11]] < c_b) 2688 | if(p[pixel[12]] < c_b) 2689 | if(p[pixel[13]] < c_b) 2690 | if(p[pixel[14]] < c_b) 2691 | if(p[pixel[15]] < c_b) 2692 | {} 2693 | else 2694 | continue; 2695 | else 2696 | continue; 2697 | else 2698 | continue; 2699 | else 2700 | continue; 2701 | else 2702 | continue; 2703 | else 2704 | if(p[pixel[10]] < c_b) 2705 | if(p[pixel[11]] < c_b) 2706 | if(p[pixel[12]] < c_b) 2707 | if(p[pixel[13]] < c_b) 2708 | if(p[pixel[14]] < c_b) 2709 | if(p[pixel[15]] < c_b) 2710 | {} 2711 | else 2712 | continue; 2713 | else 2714 | continue; 2715 | else 2716 | continue; 2717 | else 2718 | continue; 2719 | else 2720 | continue; 2721 | else 2722 | continue; 2723 | else 2724 | if(p[pixel[9]] < c_b) 2725 | if(p[pixel[10]] < c_b) 2726 | if(p[pixel[11]] < c_b) 2727 | if(p[pixel[12]] < c_b) 2728 | if(p[pixel[13]] < c_b) 2729 | if(p[pixel[14]] < c_b) 2730 | if(p[pixel[15]] < c_b) 2731 | {} 2732 | else 2733 | continue; 2734 | else 2735 | continue; 2736 | else 2737 | continue; 2738 | else 2739 | continue; 2740 | else 2741 | continue; 2742 | else 2743 | continue; 2744 | else 2745 | continue; 2746 | else 2747 | if(p[pixel[8]] < c_b) 2748 | if(p[pixel[9]] < c_b) 2749 | if(p[pixel[10]] < c_b) 2750 | if(p[pixel[11]] < c_b) 2751 | if(p[pixel[12]] < c_b) 2752 | if(p[pixel[13]] < c_b) 2753 | if(p[pixel[14]] < c_b) 2754 | if(p[pixel[15]] < c_b) 2755 | {} 2756 | else 2757 | continue; 2758 | else 2759 | continue; 2760 | else 2761 | continue; 2762 | else 2763 | continue; 2764 | else 2765 | continue; 2766 | else 2767 | continue; 2768 | else 2769 | continue; 2770 | else 2771 | continue; 2772 | else 2773 | if(p[pixel[7]] > cb) 2774 | if(p[pixel[4]] > cb) 2775 | if(p[pixel[5]] > cb) 2776 | if(p[pixel[6]] > cb) 2777 | if(p[pixel[8]] > cb) 2778 | if(p[pixel[9]] > cb) 2779 | if(p[pixel[10]] > cb) 2780 | if(p[pixel[11]] > cb) 2781 | if(p[pixel[12]] > cb) 2782 | if(p[pixel[13]] > cb) 2783 | if(p[pixel[14]] > cb) 2784 | if(p[pixel[15]] > cb) 2785 | {} 2786 | else 2787 | continue; 2788 | else 2789 | continue; 2790 | else 2791 | continue; 2792 | else 2793 | continue; 2794 | else 2795 | continue; 2796 | else 2797 | continue; 2798 | else 2799 | continue; 2800 | else 2801 | continue; 2802 | else 2803 | continue; 2804 | else 2805 | continue; 2806 | else 2807 | continue; 2808 | else if(p[pixel[7]] < c_b) 2809 | if(p[pixel[8]] < c_b) 2810 | if(p[pixel[9]] < c_b) 2811 | if(p[pixel[10]] < c_b) 2812 | if(p[pixel[11]] < c_b) 2813 | if(p[pixel[12]] < c_b) 2814 | if(p[pixel[13]] < c_b) 2815 | if(p[pixel[14]] < c_b) 2816 | if(p[pixel[15]] < c_b) 2817 | {} 2818 | else 2819 | continue; 2820 | else 2821 | continue; 2822 | else 2823 | continue; 2824 | else 2825 | continue; 2826 | else 2827 | continue; 2828 | else 2829 | continue; 2830 | else 2831 | continue; 2832 | else 2833 | continue; 2834 | else 2835 | continue; 2836 | else 2837 | if(p[pixel[6]] > cb) 2838 | if(p[pixel[4]] > cb) 2839 | if(p[pixel[5]] > cb) 2840 | if(p[pixel[7]] > cb) 2841 | if(p[pixel[8]] > cb) 2842 | if(p[pixel[9]] > cb) 2843 | if(p[pixel[10]] > cb) 2844 | if(p[pixel[11]] > cb) 2845 | if(p[pixel[12]] > cb) 2846 | if(p[pixel[13]] > cb) 2847 | if(p[pixel[14]] > cb) 2848 | if(p[pixel[3]] > cb) 2849 | {} 2850 | else 2851 | if(p[pixel[15]] > cb) 2852 | {} 2853 | else 2854 | continue; 2855 | else 2856 | continue; 2857 | else 2858 | continue; 2859 | else 2860 | continue; 2861 | else 2862 | continue; 2863 | else 2864 | continue; 2865 | else 2866 | continue; 2867 | else 2868 | continue; 2869 | else 2870 | continue; 2871 | else 2872 | continue; 2873 | else 2874 | continue; 2875 | else if(p[pixel[6]] < c_b) 2876 | if(p[pixel[7]] < c_b) 2877 | if(p[pixel[8]] < c_b) 2878 | if(p[pixel[9]] < c_b) 2879 | if(p[pixel[10]] < c_b) 2880 | if(p[pixel[11]] < c_b) 2881 | if(p[pixel[12]] < c_b) 2882 | if(p[pixel[13]] < c_b) 2883 | if(p[pixel[14]] < c_b) 2884 | if(p[pixel[15]] < c_b) 2885 | {} 2886 | else 2887 | if(p[pixel[3]] < c_b) 2888 | if(p[pixel[4]] < c_b) 2889 | if(p[pixel[5]] < c_b) 2890 | {} 2891 | else 2892 | continue; 2893 | else 2894 | continue; 2895 | else 2896 | continue; 2897 | else 2898 | continue; 2899 | else 2900 | continue; 2901 | else 2902 | continue; 2903 | else 2904 | continue; 2905 | else 2906 | continue; 2907 | else 2908 | continue; 2909 | else 2910 | continue; 2911 | else 2912 | continue; 2913 | else 2914 | continue; 2915 | else 2916 | if(p[pixel[5]] > cb) 2917 | if(p[pixel[4]] > cb) 2918 | if(p[pixel[6]] > cb) 2919 | if(p[pixel[7]] > cb) 2920 | if(p[pixel[8]] > cb) 2921 | if(p[pixel[9]] > cb) 2922 | if(p[pixel[10]] > cb) 2923 | if(p[pixel[11]] > cb) 2924 | if(p[pixel[12]] > cb) 2925 | if(p[pixel[13]] > cb) 2926 | if(p[pixel[3]] > cb) 2927 | if(p[pixel[2]] > cb) 2928 | {} 2929 | else 2930 | if(p[pixel[14]] > cb) 2931 | {} 2932 | else 2933 | continue; 2934 | else 2935 | if(p[pixel[14]] > cb) 2936 | if(p[pixel[15]] > cb) 2937 | {} 2938 | else 2939 | continue; 2940 | else 2941 | continue; 2942 | else 2943 | continue; 2944 | else 2945 | continue; 2946 | else 2947 | continue; 2948 | else 2949 | continue; 2950 | else 2951 | continue; 2952 | else 2953 | continue; 2954 | else 2955 | continue; 2956 | else 2957 | continue; 2958 | else 2959 | continue; 2960 | else if(p[pixel[5]] < c_b) 2961 | if(p[pixel[6]] < c_b) 2962 | if(p[pixel[7]] < c_b) 2963 | if(p[pixel[8]] < c_b) 2964 | if(p[pixel[9]] < c_b) 2965 | if(p[pixel[10]] < c_b) 2966 | if(p[pixel[11]] < c_b) 2967 | if(p[pixel[12]] < c_b) 2968 | if(p[pixel[13]] < c_b) 2969 | if(p[pixel[14]] < c_b) 2970 | if(p[pixel[15]] < c_b) 2971 | {} 2972 | else 2973 | if(p[pixel[3]] < c_b) 2974 | if(p[pixel[4]] < c_b) 2975 | {} 2976 | else 2977 | continue; 2978 | else 2979 | continue; 2980 | else 2981 | if(p[pixel[2]] < c_b) 2982 | if(p[pixel[3]] < c_b) 2983 | if(p[pixel[4]] < c_b) 2984 | {} 2985 | else 2986 | continue; 2987 | else 2988 | continue; 2989 | else 2990 | continue; 2991 | else 2992 | continue; 2993 | else 2994 | continue; 2995 | else 2996 | continue; 2997 | else 2998 | continue; 2999 | else 3000 | continue; 3001 | else 3002 | continue; 3003 | else 3004 | continue; 3005 | else 3006 | continue; 3007 | else 3008 | continue; 3009 | else 3010 | if(p[pixel[4]] > cb) 3011 | if(p[pixel[5]] > cb) 3012 | if(p[pixel[6]] > cb) 3013 | if(p[pixel[7]] > cb) 3014 | if(p[pixel[8]] > cb) 3015 | if(p[pixel[9]] > cb) 3016 | if(p[pixel[10]] > cb) 3017 | if(p[pixel[11]] > cb) 3018 | if(p[pixel[12]] > cb) 3019 | if(p[pixel[3]] > cb) 3020 | if(p[pixel[2]] > cb) 3021 | if(p[pixel[1]] > cb) 3022 | {} 3023 | else 3024 | if(p[pixel[13]] > cb) 3025 | {} 3026 | else 3027 | continue; 3028 | else 3029 | if(p[pixel[13]] > cb) 3030 | if(p[pixel[14]] > cb) 3031 | {} 3032 | else 3033 | continue; 3034 | else 3035 | continue; 3036 | else 3037 | if(p[pixel[13]] > cb) 3038 | if(p[pixel[14]] > cb) 3039 | if(p[pixel[15]] > cb) 3040 | {} 3041 | else 3042 | continue; 3043 | else 3044 | continue; 3045 | else 3046 | continue; 3047 | else 3048 | continue; 3049 | else 3050 | continue; 3051 | else 3052 | continue; 3053 | else 3054 | continue; 3055 | else 3056 | continue; 3057 | else 3058 | continue; 3059 | else 3060 | continue; 3061 | else 3062 | continue; 3063 | else if(p[pixel[4]] < c_b) 3064 | if(p[pixel[5]] < c_b) 3065 | if(p[pixel[6]] < c_b) 3066 | if(p[pixel[7]] < c_b) 3067 | if(p[pixel[8]] < c_b) 3068 | if(p[pixel[9]] < c_b) 3069 | if(p[pixel[10]] < c_b) 3070 | if(p[pixel[11]] < c_b) 3071 | if(p[pixel[12]] < c_b) 3072 | if(p[pixel[3]] < c_b) 3073 | if(p[pixel[2]] < c_b) 3074 | if(p[pixel[1]] < c_b) 3075 | {} 3076 | else 3077 | if(p[pixel[13]] < c_b) 3078 | {} 3079 | else 3080 | continue; 3081 | else 3082 | if(p[pixel[13]] < c_b) 3083 | if(p[pixel[14]] < c_b) 3084 | {} 3085 | else 3086 | continue; 3087 | else 3088 | continue; 3089 | else 3090 | if(p[pixel[13]] < c_b) 3091 | if(p[pixel[14]] < c_b) 3092 | if(p[pixel[15]] < c_b) 3093 | {} 3094 | else 3095 | continue; 3096 | else 3097 | continue; 3098 | else 3099 | continue; 3100 | else 3101 | continue; 3102 | else 3103 | continue; 3104 | else 3105 | continue; 3106 | else 3107 | continue; 3108 | else 3109 | continue; 3110 | else 3111 | continue; 3112 | else 3113 | continue; 3114 | else 3115 | continue; 3116 | else 3117 | continue; 3118 | if(num_corners == rsize) 3119 | { 3120 | rsize*=2; 3121 | ret_corners = (xy*)realloc(ret_corners, sizeof(xy)*rsize); 3122 | } 3123 | 3124 | ret_corners[num_corners].x = x; 3125 | ret_corners[num_corners].y = y; 3126 | num_corners++; 3127 | } 3128 | 3129 | *ret_num_corners = num_corners; 3130 | return ret_corners; 3131 | 3132 | } 3133 | 3134 | 3135 | --------------------------------------------------------------------------------