24#ifndef _POINTSAMPLER_H
25#define _POINTSAMPLER_H
30#include <hugin_config.h>
31#include <vigra/stdimage.hxx>
48 enum LimitType{LIMIT_UINT8, LIMIT_UINT16, LIMIT_FLOAT};
75 o_images(images), o_numPoints(nPoints), m_limits(
limits)
85 vigra::FRGBImage::ConstAccessor,
93 const std::vector<vigra::FImage*>&
voteImgs,
96 std::vector<std::multimap<double,vigra_ext::PointPairRGB> >&
radiusHist,
105 template<
class Po
intPairClass>
106 static void sampleRadiusUniform(
const std::vector<std::multimap<double,PointPairClass> >&
radiusHist,
117 virtual bool runAlgorithm();
134 return o_resultPoints;
167 template <
class Img,
class VoteImg,
class PP>
169 const std::vector<VoteImg *> &
voteImgs,
173 std::vector<std::multimap<double, PP > > &
radiusHist,
181 const std::vector<vigra::FImage*>&
voteImgs,
184 std::vector<std::multimap<double,vigra_ext::PointPairRGB> >&
radiusHist,
221 template <
class Img,
class VoteImg,
class PP>
223 const std::vector<VoteImg *> &
voteImgs,
227 std::vector<std::multimap<double, PP > > &
radiusHist,
234 const std::vector<vigra::FImage*>&
voteImgs,
237 std::vector<std::multimap<double,vigra_ext::PointPairRGB> >&
radiusHist,
269template<
class Po
intPairClass>
275 typedef std::multimap<double,PointPairClass>
PointPairMap;
281 for (
typename std::vector<PointPairMap>::const_iterator
bin =
radiusHist.begin();
286 for (
typename PointPairMap::const_iterator
it= (*bin).begin();
287 it != (*bin).end(); ++
it)
300template <
class Img,
class VoteImg,
class PP>
302 const std::vector<VoteImg *> &
voteImgs,
307 std::vector<std::multimap<double, PP > > &
radiusHist,
312 typedef typename Img::PixelType PixelType;
320 vigra_precondition(imgs.size() > 1,
"sampleAllPanoPoints: At least two images required");
322 const unsigned nImg = imgs.size();
329 std::vector<PTools::Transform*>
transf(imgs.size());
332 for(
unsigned i=0;
i <
nImg;
i++) {
339 for (
int y=
roi.top(); y <
roi.bottom(); ++y) {
340 for (
int x=
roi.left(); x <
roi.right(); ++x) {
342 for (
unsigned i=0;
i<
nImg-1;
i++) {
364 for (
unsigned j=
i+1;
j <
nImg;
j++) {
395 pp =
PP(
i, i1, p1, r1,
j, i2, p2, r2);
397 pp =
PP(
j, i2, p2, r2,
i, i1, p1, r1);
403 std::multimap<double, PP> *
destMap;
406 }
else if (
map2->empty()) {
408 }
else if (
map1->size() <
map2->size()) {
410 }
else if (
map1->size() >
map2->size()) {
412 }
else if (
map1->rbegin()->first >
map2->rbegin()->first) {
433 for(
unsigned i=0;
i <
nImg;
i++) {
440template <
class Img,
class VoteImg,
class PP>
442 const std::vector<VoteImg *> &
voteImgs,
447 std::vector<std::multimap<double, PP > > &
radiusHist,
451 typedef typename Img::PixelType PixelType;
453 vigra_precondition(imgs.size() > 1,
"sampleRandomPanoPoints: At least two images required");
455 const unsigned nImg = imgs.size();
462 std::vector<PTools::Transform *>
transf(imgs.size());
463 std::vector<double>
maxr(imgs.size());
466 for(
unsigned i=0;
i <
nImg;
i++) {
476 std::mt19937
rng(
static_cast<unsigned int>(std::time(0)));
477 std::uniform_int_distribution<unsigned int>
distribx(
roi.left(),
roi.right()-1);
478 std::uniform_int_distribution<unsigned int>
distriby(
roi.top(),
roi.bottom()-1);
483 unsigned x =
randX();
484 unsigned y =
randY();
486 for (
unsigned i=0;
i<
nImg-1;
i++) {
499 if ( imgs[
i](p1.
x,p1.
y, i1,
maskI)){
506 for (
unsigned j=
i+1;
j <
nImg;
j++) {
529 points.push_back(
PP(
i, i1, p1, r1,
j, i2, p2, r2) );
531 points.push_back(
PP(
j, i2, p2, r2,
i, i1, p1, r1) );
547 pp =
PP(
i, i1, p1, r1,
j, i2, p2, r2);
549 pp =
PP(
j, i2, p2, r2,
i, i1, p1, r1);
555 std::multimap<double, PP> *
destMap;
558 }
else if (
map2->empty()) {
560 }
else if (
map1->size() <
map2->size()) {
562 }
else if (
map1->size() >
map2->size()) {
564 }
else if (
map1->rbegin()->first >
map2->rbegin()->first) {
585 for(
unsigned i=0;
i < imgs.size();
i++) {
virtual void samplePoints(const std::vector< InterpolImg > &imgs, const std::vector< vigra::FImage * > &voteImgs, const PanoramaData &pano, const LimitIntensityVector limitI, std::vector< std::multimap< double, vigra_ext::PointPairRGB > > &radiusHist, unsigned &nGoodPoints, unsigned &nBadPoints, AppBase::ProgressDisplay *progress)
AllPointSampler(PanoramaData &panorama, AppBase::ProgressDisplay *progressDisplay, std::vector< vigra::FRGBImage * > images, LimitIntensityVector limits, int nPoints)
static void sampleAllPanoPoints(const std::vector< Img > &imgs, const std::vector< VoteImg * > &voteImgs, const PanoramaData &pano, int nPoints, const LimitIntensityVector limitI, std::vector< std::multimap< double, PP > > &radiusHist, unsigned &nGoodPoints, unsigned &nBadPoints, AppBase::ProgressDisplay *progress)
sample all points inside a panorama and check for create a bins of point pairs that include a specifi...
virtual ~AllPointSampler()
class for storing the limits of an image used by the sampler to exclude too dark or too bright pixel
const float GetMaxI() const
return the upper limit
LimitType
some pre-defined limits
const float GetMinI() const
return the lower limit
virtual const PanoramaOptions & getOptions() const =0
returns the options for this panorama
virtual const SrcPanoImage & getImage(std::size_t nr) const =0
get a panorama image, counting starts with 0
const vigra::Rect2D & getROI() const
PointPairs getResultPoints()
static void sampleRadiusUniform(const std::vector< std::multimap< double, PointPairClass > > &radiusHist, unsigned nPoints, std::vector< PointPairClass > &selectedPoints, AppBase::ProgressDisplay *)
extract some random points out of the bins.
std::vector< vigra_ext::PointPairRGB > PointPairs
std::vector< vigra::FRGBImage * > o_images
virtual void samplePoints(const std::vector< InterpolImg > &imgs, const std::vector< vigra::FImage * > &voteImgs, const PanoramaData &pano, const LimitIntensityVector limitI, std::vector< std::multimap< double, vigra_ext::PointPairRGB > > &radiusHist, unsigned &nGoodPoints, unsigned &nBadPoints, AppBase::ProgressDisplay *)=0
LimitIntensityVector m_limits
PointSampler(PanoramaData &panorama, AppBase::ProgressDisplay *progressDisplay, std::vector< vigra::FRGBImage * > images, LimitIntensityVector limits, int nPoints)
vigra_ext::ImageInterpolator< vigra::FRGBImage::const_traverser, vigra::FRGBImage::ConstAccessor, vigra_ext::interp_cubic > InterpolImg
PointPairs o_resultPoints
virtual bool modifiesPanoramaData() const
returns true if the algorithm changes the PanoramaData.
virtual void samplePoints(const std::vector< InterpolImg > &imgs, const std::vector< vigra::FImage * > &voteImgs, const PanoramaData &pano, const LimitIntensityVector limitI, std::vector< std::multimap< double, vigra_ext::PointPairRGB > > &radiusHist, unsigned &nGoodPoints, unsigned &nBadPoints, AppBase::ProgressDisplay *progress)
virtual ~RandomPointSampler()
RandomPointSampler(PanoramaData &panorama, AppBase::ProgressDisplay *progressDisplay, std::vector< vigra::FRGBImage * > images, LimitIntensityVector limits, int nPoints)
static void sampleRandomPanoPoints(const std::vector< Img > &imgs, const std::vector< VoteImg * > &voteImgs, const PanoramaData &pano, int nPoints, const LimitIntensityVector limitI, std::vector< std::multimap< double, PP > > &radiusHist, unsigned &nBadPoints, AppBase::ProgressDisplay *progress)
hugin_utils::FDiff2D getRadialVigCorrCenter() const
bool isInside(vigra::Point2D p, bool ignoreMasks=false) const
check if a coordinate is inside the source image
"wrapper" for efficient interpolation access to an image
mainly consists of wrapper around the pano tools library, to assist in ressource management and to pr...
std::vector< LimitIntensity > LimitIntensityVector
V getMaxComponent(vigra::RGBValue< V > const &v)
get the maximum component of a vector (also works for single pixel types...)
vigra::Diff2D toDiff2D() const
std::vector< deghosting::BImagePtr > threshold(const std::vector< deghosting::FImagePtr > &inputImages, const double threshold, const uint16_t flags)
Threshold function used for creating alpha masks for images.
functions to manage ROI's