optimised input image management
This commit is contained in:
parent
1a749c5141
commit
b4d42ae6f1
@ -92,6 +92,11 @@ Retina::~Retina()
|
|||||||
delete _retinaFilter;
|
delete _retinaFilter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Retina::setColorSaturation(const bool saturateColors, const double colorSaturationValue)
|
||||||
|
{
|
||||||
|
_retinaFilter->setColorSaturation(saturateColors, colorSaturationValue);
|
||||||
|
}
|
||||||
|
|
||||||
void Retina::setup(std::string retinaParameterFile, const bool applyDefaultSetupOnFailure)
|
void Retina::setup(std::string retinaParameterFile, const bool applyDefaultSetupOnFailure)
|
||||||
{
|
{
|
||||||
// open specified parameters file
|
// 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>
|
// first convert input image to the compatible format : std::valarray<double>
|
||||||
double *imagePTR=&_inputBuffer[0];
|
const bool colorMode = _convertCvMat2ValarrayBuffer(inputMatToConvert, _inputBuffer);
|
||||||
|
|
||||||
if (!colorMode)
|
|
||||||
{
|
|
||||||
for (int i=0;i<inputImage.size().height;++i)
|
|
||||||
{
|
|
||||||
const unsigned char *linePTR = inputImage.ptr<unsigned char>(i);
|
|
||||||
for (int j=0;j<inputImage.size().width;++j)
|
|
||||||
*(imagePTR++) =(double)*(linePTR++);
|
|
||||||
}
|
|
||||||
}else
|
|
||||||
{
|
|
||||||
const unsigned int doubleNBpixelsPerLayer=_retinaFilter->getInputNBpixels()*2;
|
|
||||||
for (int i=0;i<inputImage.size().height;++i)
|
|
||||||
{
|
|
||||||
for (int j=0;j<inputImage.size().width;++j,++imagePTR)
|
|
||||||
{
|
|
||||||
cv::Point2d pixel(j,i);
|
|
||||||
cv::Vec3b pixelValue=inputImage.at<cv::Vec3b>(pixel);
|
|
||||||
*(imagePTR) =(double)pixelValue[2];
|
|
||||||
*(imagePTR+_retinaFilter->getInputNBpixels()) =(double)pixelValue[1];
|
|
||||||
*(imagePTR+doubleNBpixelsPerLayer ) =(double)pixelValue[0];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// process the retina
|
// process the retina
|
||||||
if (!_retinaFilter->runFilter(_inputBuffer, colorMode, false, colorMode, false))
|
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);
|
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())
|
if (_retinaFilter->getColorMode())
|
||||||
{
|
{
|
||||||
// reallocate output buffer (if necessary)
|
// 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
|
}else
|
||||||
{
|
{
|
||||||
// reallocate output buffer (if necessary)
|
// 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;
|
//retinaOutput_parvo/=255.0;
|
||||||
}
|
}
|
||||||
void Retina::getMagno(cv::Mat &retinaOutput_magno)
|
void Retina::getMagno(cv::Mat &retinaOutput_magno)
|
||||||
{
|
{
|
||||||
// reallocate output buffer (if necessary)
|
// 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;
|
//retinaOutput_magno/=255.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// private method called by constructirs
|
// 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)
|
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<<printSetup()<<std::endl;
|
std::cout<<printSetup()<<std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Retina::_convertValarrayGrayBuffer2cvMat(const std::valarray<double> &grayMatrixToConvert, const unsigned int nbRows, const unsigned int nbColumns, const bool colorMode, cv::Mat &outBuffer)
|
void Retina::_convertValarrayBuffer2cvMat(const std::valarray<double> &grayMatrixToConvert, const unsigned int nbRows, const unsigned int nbColumns, const bool colorMode, cv::Mat &outBuffer)
|
||||||
{
|
{
|
||||||
// fill output buffer with the valarray buffer
|
// fill output buffer with the valarray buffer
|
||||||
const double *valarrayPTR=get_data(grayMatrixToConvert);
|
const double *valarrayPTR=get_data(grayMatrixToConvert);
|
||||||
@ -404,6 +373,40 @@ void Retina::_convertValarrayGrayBuffer2cvMat(const std::valarray<double> &grayM
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const bool Retina::_convertCvMat2ValarrayBuffer(const cv::Mat inputMatToConvert, std::valarray<double> &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_<double>(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();}
|
void Retina::clearBuffers() {_retinaFilter->clearAllBuffers();}
|
||||||
|
|
||||||
} // end of namespace cv
|
} // end of namespace cv
|
||||||
|
Loading…
x
Reference in New Issue
Block a user