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
void foerstnerCornerDetector(...)
Find corners in an image (2).
void rohrCornerDetector(...)
Find corners in an image (3).
void beaudetCornerDetector(...)
Find corners in an image (4).
void combineThreeImages(...)
Combine three source images into destination image.
void structureTensor(...)
Calculate the Structure Tensor for each pixel of and image, using Gaussian (derivative) filters...
void cornerResponseFunction(...)
Find corners in an image (1).
void hessianMatrixOfGaussian(...)
Filter image with the 2nd derivatives of the Gaussian at the given scale to get the Hessian matrix...