コード例 #1
0
void FourierDescriptorsExtractor::_getBoundaryPolygon( const Image &_img,
                                                       std::vector<Vec2d> &poly )
{
   IntDeque cont;

   _getContour(_img, cont);
   
   for (int i = cont.size() - 1; i >= 0; i--)
   { 
      int &p = cont[i];
      Vec2d v;
      v.y = p / (_img.getWidth() + 1);
      v.x = p % (_img.getWidth() + 1);
      poly.push_back(v);
   }

   //return;
   
   poly.push_back(Vec2d(poly[0])); //Vec2d(poly[0])
   _approximatePolygon(poly);
   //Array<Vec2d> approximated;
   //Approximator::apply(poly, approximated);

   //poly.copy(approximated);
   //_drawPolygon(_img, poly);
}
コード例 #2
0
ファイル: test_main.cpp プロジェクト: zfbp/scgl
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;
}
コード例 #3
0
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);
}
コード例 #4
0
ファイル: radix.cpp プロジェクト: Flameeyes/stdcxx
IntList::iterator
copyList (IntList::iterator c, IntDeque &lst) {
    
    return std::copy (lst.begin (), lst.end (), c);
}