bool Init() { int nRandom = 0; for (int i = 0; i < g_nMax; ++i) { nRandom = i; g_nSummary += nRandom; g_dInts.push_back(nRandom); g_hmInts.insert(std::make_pair(nRandom, nRandom)); g_hsInts.insert(nRandom); g_lInts.push_back(nRandom); g_mInts.insert(std::make_pair(nRandom, nRandom)); g_mmInts.insert(std::make_pair(nRandom, nRandom)); g_msInts.insert(nRandom); g_sInts.insert(nRandom); g_vInts.push_back(nRandom); } return true; }
void FourierDescriptorsExtractor::_getContour( const Image &_img, IntDeque &cont ) { Image img; img.copy(_img); Binarizer(img, 190).apply(); //ImageUtils::saveImageToFile(img, "output/gc.png"); int w = img.getWidth(), h = img.getHeight(); int k = (h + 1) * (w + 1); int begin = 0, x, y; byte ul, ur, dl, dr; int i; std::deque<int> prev(k, -1); double dist = 0; double min_dist = 1e16; for (i = 0; i < w * h; i++) { if (img[i] != 255) { y = i / w; x = i % w; //begin = y * (w + 1) + x; dist = sqrt((double)x * x + y * y); if (min_dist - dist > EPS) { min_dist = dist; begin = i + i / w; } //begin = i + i / w; //break; } } std::stack<int> stack; int cur, p = 0; int t = 0, s = 0; int next[4] = {-1, -1, -1, -1}; int delta; int first; first = begin + 1; y = first / (w + 1); x = first % (w + 1); if (begin >= w + 2 && img[first - 1 - y] != 255 && img[first - w - 1 - (y - 1)] != 255 && img[first - y] != 0 && img[first - w - 1 - 1 - (y - 1)] != 0) { first -= w + 1; } cur = first; stack.push(cur); int iterations = 0; while (true) { iterations++; if (iterations > k) throw NoContourException("infinite loop"); if (stack.size() == 0) throw NoContourException(); cur = stack.top(); stack.pop(); prev[cur] = p; delta = cur - p; if (cur == begin) break; y = cur / (w + 1); x = cur % (w + 1); if (y > 0 && y < h && x > 0 && x < w) { if (img[cur - y] != 255 && img[cur - w - 1 - 1 - (y - 1)] != 255 && img[cur - 1 - y] != 0 && img[cur - w - 1 - (y - 1)] != 0) { if (delta == w + 1 || delta == w) t = cur + 1; else if (delta == -1) // || delta == w + 2 t = cur - w - 1; else if (delta == -(w + 1) || delta == -w) t = cur - 1; else if (delta == 1) // || delta == -(w + 2) t = cur + w + 1; prev[cur] = -1; stack.push(t); continue; } if (img[cur - 1 - y] != 255 && img[cur - w - 1 - (y - 1)] != 255 && img[cur - y] != 0 && img[cur - w - 1 - 1 - (y - 1)] != 0) { if (delta == w + 1) // || delta == w t = cur - 1; else if (delta == -1 || delta == -(w + 2)) t = cur + w + 1; else if (delta == -(w + 1)) // || delta == -w t = cur + 1; else if (delta == 1 || delta == w + 2) t = cur - (w + 1); prev[cur] = -1; stack.push(t); continue; } } if (delta == 1 || delta == (w + 2)) s = 4; else if (delta == (w + 1) || delta == w || delta == 2 * (w + 1)) s = 3; else if (delta == -1 || delta == -(w + 2)) s = 2; else if (delta == -(w + 1) || delta == -w || delta == -2 * (w + 1)) s = 1; //Where can we go from there ul = (x - 1 >= 0 && y - 1 >= 0)?img.getByte(x - 1, y - 1):255; ur = (x < w && y - 1 >= 0)?img.getByte(x, y - 1):255; dl = (x - 1 >= 0 && y < h)?img.getByte(x - 1, y):255; dr = (x < w && y < h)?img.getByte(x, y):255; if (y - 1 >= 0 && (ul - ur) != 0) { next[(s + 0) % 4] = cur - w - 1; } if (x + 1 < w + 1 && (ur - dr) != 0) { next[(s + 1) % 4] = cur + 1; } if (y + 1 < h + 1 && (dr - dl) != 0) { next[(s + 2) % 4] = cur + w + 1; } if (x - 1 >= 0 && (dl - ul) != 0) { next[(s + 3) % 4] = cur - 1; } for (i = 3; i >= 0; i--) { if (next[i] != -1) { if (prev[next[i]] == -1) stack.push(next[i]); next[i] = -1; } } p = cur; } cont.clear(); cur = prev[begin]; do { cont.push_back(cur); cur = prev[cur]; } while (cur != first); cont.push_back(begin); }