/***************************************************************************
* Copyright (C) 2008 by Tim Nugent
* timnugent@gmail.com
*
* This file is part of hugin.
*
* Hugin is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* Hugin is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Hugin If not, see .
*
***************************************************************************/
#ifndef __CELESTE__
#define __CELESTE__
#include
#include "svm.h"
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
namespace celeste
{
/** loads the SVM model from file
* @param model struct, which stores the SVM informations, if you don't need it, call destroySVMmodel
* @param model_file filename of model file to load
* @return true, if loading of SVM file was sucessfull
*/
CELESTEIMPEX bool loadSVMmodel(struct svm_model*& model, string& model_file);
/** frees the resource of model
* @param model SVM model struct to freeing
*/
CELESTEIMPEX void destroySVMmodel(struct svm_model*& model);
/** calculates the mask using SVM
* @param model struct svm_model which is used
* @param input input image
* @param radius radius for calculation of mask, smaller value results in higher resolution but longer calculation time
* @param threshold thresold value, lower value will reject more values
* @param resize_dimension the image is resized for calculation that the bigger dimension is small than resize_dimension
* @param adaptThreshold if true then the threshold is changed, if the all values are higher than threshold
* @return vigra::BImage, which contains the masks
*/
CELESTEIMPEX vigra::BImage getCelesteMask(struct svm_model* model, vigra::UInt16RGBImage& input, int radius, float threshold, int resize_dimension,bool adaptThreshold=false,bool verbose=true);
CELESTEIMPEX HuginBase::UIntSet getCelesteControlPoints(struct svm_model* model, vigra::UInt16RGBImage& input, HuginBase::CPointVector cps, int radius, float threshold, int resize_dimension,bool verbose=true);
/** converts the given image to UInt16RGBImage
* only this image is correctly processed by celeste
* @param src input image
* @param origType pixel type of input image
* @param dest converted image
*/
template
void convertToUInt16(SrcIMG & src, const std::string & origType, vigra::UInt16RGBImage & dest)
{
dest.resize(src.size());
long newMax=vigra_ext::getMaxValForPixelType("UINT16");
// float needs to be from min ... max.
if (origType == "FLOAT" || origType == "DOUBLE")
{
/** @TODO this convert routine scale the input values range into the full scale of UInt16
* this is not fully correct
*/
vigra::RGBToGrayAccessor > ga;
vigra::FindMinMax minmax; // init functor
vigra::inspectImage(srcImageRange(src, ga),
minmax);
double minVal = minmax.min;
double maxVal = minmax.max;
vigra_ext::applyMapping(srcImageRange(src), destImage(dest), minVal, maxVal, 0);
}
else
{
vigra::transformImage(srcImageRange(src), destImage(dest),
vigra::functor::Arg1()*vigra::functor::Param( newMax/ vigra_ext::getMaxValForPixelType(origType)));
};
}
}
#endif