コード例 #1
0
ファイル: lineedgelocatorop.hpp プロジェクト: dhr/evp
 ImageBuffer apply(const CurveBuffers& lines, ImageBuffer output) {
   i32 nts = lines.size(0);
   i32 nks = lines.size(1);
   
   ImageBuffer amounts;
   
   ImBufList bufStack;
   PopAdaptor popper(bufStack);
   PushAdaptor pusher(bufStack);
   
   if (preloadBuffers_ && contextID_ != CurrentContextID()) {
     LoadSparseFilters(sparseKernels_.begin(),
                       sparseKernels_.end(),
                       sparseBufs_.begin());
     contextID_ = CurrentContextID();
   }
   
   for (i32 tji = 0; tji < nts; ++tji) {
     for (i32 kji = 0; kji < nks; ++kji)
       pusher.output(lines(tji, kji));
     
     ImageBuffer lineLocs = Merge(Max, nks, popper);
     pusher.output(Filter(lineLocs, sparseBufs_[tji]));
   }
   
   return Merge(Add, nts, popper, output);
 }
コード例 #2
0
ファイル: flowsupportop.hpp プロジェクト: dhr/evp
 ImageBuffer apply(const NDArray<ImageBuffer,3>& input, ImageBuffer output) {
   ImBufList stack;
   PopAdaptor popper(stack);
   PushAdaptor pusher(stack);
   
   if (!kernBufs_[0].valid())
     LoadSparseFilters(kernels_.begin(), kernels_.end(), kernBufs_.begin());
 
   i32 nto = params_.numOrientations;
   i32 ncs = params_.numCurvatures;
   
   NDIndex<3> srcIndx;
   for (i32 tji = 0; tji < nto; ++tji) {
     srcIndx[0] = tji;
     
     for (i32 ktji = 0; ktji < ncs; ++ktji) {
       srcIndx[1] = ktji;
       
       for (i32 knji = 0; knji < ncs; ++knji) {
         srcIndx[2] = knji;
         
         pusher.output(Filter(input[srcIndx], kernBufs_[srcIndx]));
       }
     }
     
     pusher.output(Merge(Add, ncs*ncs, popper));
   }
   
   Merge(Add, nto, popper, output);
       
   if (params_.minSupport != 0 || params_.maxSupport != 1) {
     Rescale(output, params_.minSupport, params_.maxSupport,
             0, 1, false, output);
   }
   
   return output;
 }
コード例 #3
0
static void FindStationFromNode( Digraph& dg, Digraph::Node u, EdgeArray& es, bool reverse = false )
{
    NDArray nds;
    if( reverse )
    {
        DFS_Helper3( dg, u, nds );
    }
    else
    {
        DFS_Helper2( dg, u, nds );
    }

    std::sort( nds.begin(), nds.end(), SortNodeDist() );

    for( int i = 0; i < nds.size(); i++ )
    {
        if( i < MAX_PATH_LENGTH )
        {
            bool ret = true;
            DPath p;
            if( reverse )
            {
                ret = DFS_Helper( dg, nds[i].u, u, p );
            }
            else
            {
                ret = DFS_Helper( dg, u, nds[i].u, p );
            }
            if( !ret ) continue;

            for( DPath::ArcIt e( p ); e != INVALID; ++e )
            {
                if( !es.contains( e ) ) es.append( e );
            }
        }
    }
}
コード例 #4
0
ファイル: curvesupportop.hpp プロジェクト: dhr/evp
 ImageBuffer apply(const CurveBuffers& inputs, ImageBuffer output) {
   using namespace std::tr1;
   using namespace std::tr1::placeholders;
   
   i32 nto = params_.numTotalOrientations;
   i32 ncs = params_.numCurvatures;
   i32 nnc = params_.numNormalComponents;
   i32 ntc = params_.numTangentialComponents;
 
   ImBufList stack;
   PopAdaptor popper(stack);
   PushAdaptor pusher(stack);
   
   if (preloadBuffers_ && contextID_ != CurrentContextID()) {
     LoadSparseFilters(sparseComponents_.begin(),
                       sparseComponents_.end(),
                       filterBufs_.begin());
     contextID_ = CurrentContextID();
   }
   
   NDIndex<2> srcIndx;
   for (i32 tani = 0; tani < ntc; ++tani) {
     for (i32 ni = 0; ni < nnc; ++ni) {
       for (i32 tji = 0; tji < nto; ++tji) {
         srcIndx[0] = tji;
         
         for (i32 kji = 0; kji < ncs; ++kji) {
           srcIndx[1] = kji;
           
           if (preloadBuffers_) {
             const SparseImageBuffer& filt =
               filterBufs_(tani, ni, tji, kji);
             pusher.output(Filter(inputs[srcIndx], filt));
           }
           else {
             const SparseImageData& filt =
               sparseComponents_(tani, ni, tji, kji);
             pusher.output(Filter(inputs[srcIndx], filt));
           }
         }
       }
       
       pusher.output(Merge(Add, nto*ncs, popper));
     }
     
     pusher.output(LLMerge(LLAnd, nnc, params_.logLinDegree,
                           params_.adapt, 1.f, popper));
   }
   
   CircularAdaptor circ(stack);
   ImageBuffer sum = Merge(Add, ntc, circ);
   circ.reset();
   Map(bind(Stabilize, _1, sum, ntc, params_.stabilizer, _2), ntc, circ);
   
   i32 halfntc = ntc/2;
   
   if (ntc != 2) {
     // To support more tangential components, the surround operation would
     // have to be extended to support more than two arguments.
     assert(ntc == 4 && "Only two or four tangential components supported");
     
     ImageBuffer tcs[4] = {popper.next(), popper.next(),
                           popper.next(), popper.next()};
     
     pusher.output(Surround(tcs[1], tcs[0], params_.logLinDegree));
     pusher.output(Surround(tcs[2], tcs[3], params_.logLinDegree));
   }
   
   return LLMerge(LLAnd, ntc - 2*halfntc + 2,
                  params_.logLinDegree, params_.adapt, 1.f,
                  popper, output);
 }