37 #ifndef VIGRA_CORNERDETECTION_HXX
38 #define VIGRA_CORNERDETECTION_HXX
40 #include "utilities.hxx"
41 #include "numerictraits.hxx"
42 #include "stdimage.hxx"
43 #include "combineimages.hxx"
44 #include "convolution.hxx"
45 #include "functortraits.hxx"
49 template <
class SrcType>
50 struct CornerResponseFunctor
52 typedef typename NumericTraits<SrcType>::RealPromote argument_type;
53 typedef argument_type result_type;
55 result_type operator()(argument_type a1,
56 argument_type a2, argument_type a3)
const
58 return detail::RequiresExplicitCast<result_type>::cast((a1*a2 - a3*a3) - 0.04 * (a1 + a2) * (a1 + a2));
63 class FunctorTraits<CornerResponseFunctor<T> >
64 :
public FunctorTraitsBase<CornerResponseFunctor<T> >
67 typedef VigraTrueType isTernaryFunctor;
70 template <
class SrcType>
71 struct FoerstnerCornerFunctor
73 typedef typename NumericTraits<SrcType>::RealPromote argument_type;
74 typedef argument_type result_type;
76 result_type operator()(argument_type a1,
77 argument_type a2, argument_type a3)
const
79 return (a1*a2 - a3*a3) / (a1 + a2);
84 class FunctorTraits<FoerstnerCornerFunctor<T> >
85 :
public FunctorTraitsBase<FoerstnerCornerFunctor<T> >
88 typedef VigraTrueType isTernaryFunctor;
91 template <
class SrcType>
92 struct RohrCornerFunctor
94 typedef typename NumericTraits<SrcType>::RealPromote argument_type;
95 typedef argument_type result_type;
97 result_type operator()(argument_type a1,
98 argument_type a2, argument_type a3)
const
100 return (a1*a2 - a3*a3);
105 class FunctorTraits<RohrCornerFunctor<T> >
106 :
public FunctorTraitsBase<RohrCornerFunctor<T> >
109 typedef VigraTrueType isTernaryFunctor;
112 template <
class SrcType>
113 struct BeaudetCornerFunctor
115 typedef typename NumericTraits<SrcType>::RealPromote argument_type;
116 typedef argument_type result_type;
118 result_type operator()(argument_type a1,
119 argument_type a2, argument_type a3)
const
121 return (a3*a3 - a1*a2);
126 class FunctorTraits<BeaudetCornerFunctor<T> >
127 :
public FunctorTraitsBase<BeaudetCornerFunctor<T> >
130 typedef VigraTrueType isTernaryFunctor;
250 template <
class SrcIterator,
class SrcAccessor,
251 class DestIterator,
class DestAccessor>
254 DestIterator dul, DestAccessor ad,
257 vigra_precondition(scale > 0.0,
258 "cornerResponseFunction(): Scale must be > 0");
260 int w = slr.x - sul.x;
261 int h = slr.y - sul.y;
263 if(w <= 0 || h <= 0)
return;
266 NumericTraits<typename SrcAccessor::value_type>::RealPromote TmpType;
268 typedef BasicImage<TmpType> TmpImage;
275 destImage(gx), destImage(gxy), destImage(gy),
277 CornerResponseFunctor<typename SrcAccessor::value_type > cf;
280 destIter(dul, ad), cf );
283 template <
class SrcIterator,
class SrcAccessor,
284 class DestIterator,
class DestAccessor>
287 triple<SrcIterator, SrcIterator, SrcAccessor> src,
288 pair<DestIterator, DestAccessor> dest,
292 dest.first, dest.second,
400 template <
class SrcIterator,
class SrcAccessor,
401 class DestIterator,
class DestAccessor>
404 DestIterator dul, DestAccessor ad,
407 vigra_precondition(scale > 0.0,
408 "foerstnerCornerDetector(): Scale must be > 0");
410 int w = slr.x - sul.x;
411 int h = slr.y - sul.y;
413 if(w <= 0 || h <= 0)
return;
416 NumericTraits<typename SrcAccessor::value_type>::RealPromote TmpType;
418 typedef BasicImage<TmpType> TmpImage;
425 destImage(gx), destImage(gxy), destImage(gy),
427 FoerstnerCornerFunctor<typename SrcAccessor::value_type > cf;
430 destIter(dul, ad), cf );
433 template <
class SrcIterator,
class SrcAccessor,
434 class DestIterator,
class DestAccessor>
437 triple<SrcIterator, SrcIterator, SrcAccessor> src,
438 pair<DestIterator, DestAccessor> dest,
442 dest.first, dest.second,
547 template <
class SrcIterator,
class SrcAccessor,
548 class DestIterator,
class DestAccessor>
551 DestIterator dul, DestAccessor ad,
554 vigra_precondition(scale > 0.0,
555 "rohrCornerDetector(): Scale must be > 0");
557 int w = slr.x - sul.x;
558 int h = slr.y - sul.y;
560 if(w <= 0 || h <= 0)
return;
563 NumericTraits<typename SrcAccessor::value_type>::RealPromote TmpType;
565 typedef BasicImage<TmpType> TmpImage;
572 destImage(gx), destImage(gxy), destImage(gy),
574 RohrCornerFunctor<typename SrcAccessor::value_type > cf;
577 destIter(dul, ad), cf );
580 template <
class SrcIterator,
class SrcAccessor,
581 class DestIterator,
class DestAccessor>
584 triple<SrcIterator, SrcIterator, SrcAccessor> src,
585 pair<DestIterator, DestAccessor> dest,
589 dest.first, dest.second,
685 template <
class SrcIterator,
class SrcAccessor,
686 class DestIterator,
class DestAccessor>
689 DestIterator dul, DestAccessor ad,
692 vigra_precondition(scale > 0.0,
693 "beaudetCornerDetector(): Scale must be > 0");
695 int w = slr.x - sul.x;
696 int h = slr.y - sul.y;
698 if(w <= 0 || h <= 0)
return;
701 NumericTraits<typename SrcAccessor::value_type>::RealPromote TmpType;
703 typedef BasicImage<TmpType> TmpImage;
710 destImage(gx), destImage(gxy), destImage(gy),
712 BeaudetCornerFunctor<typename SrcAccessor::value_type > cf;
715 destIter(dul, ad), cf );
718 template <
class SrcIterator,
class SrcAccessor,
719 class DestIterator,
class DestAccessor>
722 triple<SrcIterator, SrcIterator, SrcAccessor> src,
723 pair<DestIterator, DestAccessor> dest,
727 dest.first, dest.second,
736 #endif // VIGRA_CORNERDETECTION_HXX