diff --git a/modules/contrib/src/retina.cpp b/modules/contrib/src/retina.cpp index faa9b4662978c1a2260528542e75afccb34772b9..cf655a08d8ef3530ef33c11b5d39852014f49750 100644 --- a/modules/contrib/src/retina.cpp +++ b/modules/contrib/src/retina.cpp @@ -92,6 +92,11 @@ Retina::~Retina() delete _retinaFilter; } +void Retina::setColorSaturation(const bool saturateColors, const double colorSaturationValue) +{ + _retinaFilter->setColorSaturation(saturateColors, colorSaturationValue); +} + void Retina::setup(std::string retinaParameterFile, const bool applyDefaultSetupOnFailure) { // open specified parameters file @@ -263,47 +268,10 @@ void Retina::setupIPLMagnoChannel(const bool normaliseOutput, const double paras } -void Retina::run(const cv::Mat &inputImage) +void Retina::run(const cv::Mat &inputMatToConvert) { - - // first check input consistency - if (inputImage.empty()) - throw cv::Exception(-1, "Retina cannot be applied, input buffer is empty", "Retina::run", "Retina.h", 0); - - // retreive color mode from image input - bool colorMode = inputImage.channels() >=3; - - // TODO : ensure input color image is CV_BGR coded - //if (inputImage.flags!=CV_BGR) - // throw cv::Exception(-1, "Retina color input must be BGR coded", "Retina::run", "Retina.h", 0); - // first convert input image to the compatible format : std::valarray - double *imagePTR=&_inputBuffer[0]; - - if (!colorMode) - { - for (int i=0;i(i); - for (int j=0;jgetInputNBpixels()*2; - for (int i=0;i(pixel); - *(imagePTR) =(double)pixelValue[2]; - *(imagePTR+_retinaFilter->getInputNBpixels()) =(double)pixelValue[1]; - *(imagePTR+doubleNBpixelsPerLayer ) =(double)pixelValue[0]; - } - } - } - + const bool colorMode = _convertCvMat2ValarrayBuffer(inputMatToConvert, _inputBuffer); // process the retina if (!_retinaFilter->runFilter(_inputBuffer, colorMode, false, colorMode, false)) throw cv::Exception(-1, "Retina cannot be applied, wrong input buffer size", "Retina::run", "Retina.h", 0); @@ -314,21 +282,22 @@ void Retina::getParvo(cv::Mat &retinaOutput_parvo) if (_retinaFilter->getColorMode()) { // reallocate output buffer (if necessary) - _convertValarrayGrayBuffer2cvMat(_retinaFilter->getColorOutput(), _retinaFilter->getOutputNBrows(), _retinaFilter->getOutputNBcolumns(), true, retinaOutput_parvo); + _convertValarrayBuffer2cvMat(_retinaFilter->getColorOutput(), _retinaFilter->getOutputNBrows(), _retinaFilter->getOutputNBcolumns(), true, retinaOutput_parvo); }else { // reallocate output buffer (if necessary) - _convertValarrayGrayBuffer2cvMat(_retinaFilter->getContours(), _retinaFilter->getOutputNBrows(), _retinaFilter->getOutputNBcolumns(), false, retinaOutput_parvo); + _convertValarrayBuffer2cvMat(_retinaFilter->getContours(), _retinaFilter->getOutputNBrows(), _retinaFilter->getOutputNBcolumns(), false, retinaOutput_parvo); } //retinaOutput_parvo/=255.0; } void Retina::getMagno(cv::Mat &retinaOutput_magno) { // reallocate output buffer (if necessary) - _convertValarrayGrayBuffer2cvMat(_retinaFilter->getMovingContours(), _retinaFilter->getOutputNBrows(), _retinaFilter->getOutputNBcolumns(), false, retinaOutput_magno); + _convertValarrayBuffer2cvMat(_retinaFilter->getMovingContours(), _retinaFilter->getOutputNBrows(), _retinaFilter->getOutputNBcolumns(), false, retinaOutput_magno); //retinaOutput_magno/=255.0; } + // private method called by constructirs void Retina::_init(const std::string parametersSaveFile, const cv::Size inputSize, const bool colorMode, RETINA_COLORSAMPLINGMETHOD colorSamplingMethod, const bool useRetinaLogSampling, const double reductionFactor, const double samplingStrenght) { @@ -369,7 +338,7 @@ void Retina::_init(const std::string parametersSaveFile, const cv::Size inputSiz std::cout< &grayMatrixToConvert, const unsigned int nbRows, const unsigned int nbColumns, const bool colorMode, cv::Mat &outBuffer) +void Retina::_convertValarrayBuffer2cvMat(const std::valarray &grayMatrixToConvert, const unsigned int nbRows, const unsigned int nbColumns, const bool colorMode, cv::Mat &outBuffer) { // fill output buffer with the valarray buffer const double *valarrayPTR=get_data(grayMatrixToConvert); @@ -404,6 +373,40 @@ void Retina::_convertValarrayGrayBuffer2cvMat(const std::valarray &grayM } } + +const bool Retina::_convertCvMat2ValarrayBuffer(const cv::Mat inputMatToConvert, std::valarray &outputValarrayMatrix) +{ + // first check input consistency + if (inputMatToConvert.empty()) + throw cv::Exception(-1, "Retina cannot be applied, input buffer is empty", "Retina::run", "Retina.h", 0); + + // retreive color mode from image input + bool colorMode = inputMatToConvert.channels() >=3; + + // convert to double AND fill the valarray buffer + const int dsttype = CV_64F; // output buffer is double format + + if (colorMode) + { + // create a cv::Mat table (for RGB planes) + cv::Mat planes[] = + { + cv::Mat(inputMatToConvert.size(), dsttype, &outputValarrayMatrix[_retinaFilter->getInputNBpixels()*2]), + cv::Mat(inputMatToConvert.size(), dsttype, &outputValarrayMatrix[_retinaFilter->getInputNBpixels()]), + cv::Mat(inputMatToConvert.size(), dsttype, &outputValarrayMatrix[0]) + }; + // split color cv::Mat in 3 planes... it fills valarray directely + cv::split(Mat_(inputMatToConvert), planes); + + }else + { + // create a cv::Mat header for the valarray + cv::Mat dst(inputMatToConvert.size(), dsttype, &outputValarrayMatrix[0]); + inputMatToConvert.convertTo(dst, dsttype); + } + return colorMode; +} + void Retina::clearBuffers() {_retinaFilter->clearAllBuffers();} } // end of namespace cv