37#ifndef VIGRA_CORNERDETECTION_HXX
38#define VIGRA_CORNERDETECTION_HXX
41#include "numerictraits.hxx"
42#include "stdimage.hxx"
43#include "combineimages.hxx"
44#include "convolution.hxx"
45#include "functortraits.hxx"
46#include "multi_shape.hxx"
50template <
class SrcType>
51struct CornerResponseFunctor
53 typedef typename NumericTraits<SrcType>::RealPromote argument_type;
54 typedef argument_type result_type;
56 result_type operator()(argument_type a1,
57 argument_type a2, argument_type a3)
const
59 return detail::RequiresExplicitCast<result_type>::cast((a1*a2 - a3*a3) - 0.04 * (a1 + a2) * (a1 + a2));
64class FunctorTraits<CornerResponseFunctor<T> >
65:
public FunctorTraitsBase<CornerResponseFunctor<T> >
68 typedef VigraTrueType isTernaryFunctor;
71template <
class SrcType>
72struct FoerstnerCornerFunctor
74 typedef typename NumericTraits<SrcType>::RealPromote argument_type;
75 typedef argument_type result_type;
77 result_type operator()(argument_type a1,
78 argument_type a2, argument_type a3)
const
80 return (a1*a2 - a3*a3) / (a1 + a2);
85class FunctorTraits<FoerstnerCornerFunctor<T> >
86:
public FunctorTraitsBase<FoerstnerCornerFunctor<T> >
89 typedef VigraTrueType isTernaryFunctor;
92template <
class SrcType>
93struct RohrCornerFunctor
95 typedef typename NumericTraits<SrcType>::RealPromote argument_type;
96 typedef argument_type result_type;
98 result_type operator()(argument_type a1,
99 argument_type a2, argument_type a3)
const
101 return (a1*a2 - a3*a3);
106class FunctorTraits<RohrCornerFunctor<T> >
107:
public FunctorTraitsBase<RohrCornerFunctor<T> >
110 typedef VigraTrueType isTernaryFunctor;
113template <
class SrcType>
114struct BeaudetCornerFunctor
116 typedef typename NumericTraits<SrcType>::RealPromote argument_type;
117 typedef argument_type result_type;
119 result_type operator()(argument_type a1,
120 argument_type a2, argument_type a3)
const
122 return (a3*a3 - a1*a2);
127class FunctorTraits<BeaudetCornerFunctor<T> >
128:
public FunctorTraitsBase<BeaudetCornerFunctor<T> >
131 typedef VigraTrueType isTernaryFunctor;
290 vigra_precondition(scale > 0.0,
291 "cornerResponseFunction(): Scale must be > 0");
296 if(w <= 0 ||
h <= 0)
return;
299 NumericTraits<typename SrcAccessor::value_type>::RealPromote
TmpType;
308 destImage(
gx), destImage(
gxy), destImage(
gy),
316template <
class SrcIterator,
class SrcAccessor,
317 class DestIterator,
class DestAccessor>
320 triple<SrcIterator, SrcIterator, SrcAccessor> src,
321 pair<DestIterator, DestAccessor> dest,
325 dest.first, dest.second,
329template <
class T1,
class S1,
333 MultiArrayView<2, T2, S2> dest,
336 vigra_precondition(src.shape() == dest.shape(),
337 "cornerResponseFunction(): shape mismatch between input and output.");
477 vigra_precondition(scale > 0.0,
478 "foerstnerCornerDetector(): Scale must be > 0");
483 if(w <= 0 ||
h <= 0)
return;
486 NumericTraits<typename SrcAccessor::value_type>::RealPromote
TmpType;
495 destImage(
gx), destImage(
gxy), destImage(
gy),
503template <
class SrcIterator,
class SrcAccessor,
504 class DestIterator,
class DestAccessor>
507 pair<DestIterator, DestAccessor> dest,
511 dest.first, dest.second,
515template <
class T1,
class S1,
519 MultiArrayView<2, T2, S2> dest,
522 vigra_precondition(src.shape() == dest.shape(),
523 "foerstnerCornerDetector(): shape mismatch between input and output.");
661 vigra_precondition(scale > 0.0,
662 "rohrCornerDetector(): Scale must be > 0");
667 if(w <= 0 ||
h <= 0)
return;
670 NumericTraits<typename SrcAccessor::value_type>::RealPromote
TmpType;
679 destImage(
gx), destImage(
gxy), destImage(
gy),
687template <
class SrcIterator,
class SrcAccessor,
688 class DestIterator,
class DestAccessor>
691 pair<DestIterator, DestAccessor> dest,
695 dest.first, dest.second,
699template <
class T1,
class S1,
703 MultiArrayView<2, T2, S2> dest,
706 vigra_precondition(src.shape() == dest.shape(),
707 "rohrCornerDetector(): shape mismatch between input and output.");
836 vigra_precondition(scale > 0.0,
837 "beaudetCornerDetector(): Scale must be > 0");
842 if(w <= 0 ||
h <= 0)
return;
845 NumericTraits<typename SrcAccessor::value_type>::RealPromote
TmpType;
854 destImage(
gx), destImage(
gxy), destImage(
gy),
862template <
class SrcIterator,
class SrcAccessor,
863 class DestIterator,
class DestAccessor>
866 pair<DestIterator, DestAccessor> dest,
870 dest.first, dest.second,
874template <
class T1,
class S1,
878 MultiArrayView<2, T2, S2> dest,
881 vigra_precondition(src.shape() == dest.shape(),
882 "beaudetCornerDetector(): shape mismatch between input and output.");
Class for a single RGB value.
Definition rgbvalue.hxx:128
void structureTensor(...)
Calculate the Structure Tensor for each pixel of and image, using Gaussian (derivative) filters.
void beaudetCornerDetector(...)
Find corners in an image (4).
void foerstnerCornerDetector(...)
Find corners in an image (2).
void combineThreeImages(...)
Combine three source images into destination image.
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.
void rohrCornerDetector(...)
Find corners in an image (3).