Skip to content

Commit ca7683e

Browse files
committed
bioinspired: prevent zero output when OCL is enabled but Mat was passed as buffer instead of UMat
1 parent 8dc1920 commit ca7683e

File tree

1 file changed

+14
-2
lines changed

1 file changed

+14
-2
lines changed

modules/bioinspired/src/retina.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,7 @@ class RetinaImpl : public Retina
293293
bool _convertCvMat2ValarrayBuffer(InputArray inputMatToConvert, std::valarray<float> &outputValarrayMatrix);
294294

295295

296+
bool _wasOCLRunCalled;
296297
#ifdef HAVE_OPENCL
297298
ocl::RetinaOCLImpl* _ocl_retina;
298299

@@ -564,6 +565,7 @@ void RetinaImpl::setupIPLMagnoChannel(const bool normaliseOutput, const float pa
564565
bool RetinaImpl::ocl_run(InputArray inputMatToConvert)
565566
{
566567
_ocl_retina->run(inputMatToConvert);
568+
_wasOCLRunCalled = true;
567569
return true;
568570
}
569571
#endif
@@ -572,6 +574,7 @@ void RetinaImpl::run(InputArray inputMatToConvert)
572574
{
573575
CV_OCL_RUN((_ocl_retina != 0), ocl_run(inputMatToConvert));
574576

577+
_wasOCLRunCalled = false;
575578
// first convert input image to the compatible format : std::valarray<float>
576579
const bool colorMode = _convertCvMat2ValarrayBuffer(inputMatToConvert.getMat(), _inputBuffer);
577580
// process the retina
@@ -603,6 +606,7 @@ void RetinaImpl::applyFastToneMapping(InputArray inputImage, OutputArray outputT
603606
#ifdef HAVE_OPENCL
604607
bool RetinaImpl::ocl_getParvo(OutputArray retinaOutput_parvo)
605608
{
609+
CV_Assert(_wasOCLRunCalled);
606610
_ocl_retina->getParvo(retinaOutput_parvo);
607611
return true;
608612
}
@@ -611,6 +615,7 @@ bool RetinaImpl::ocl_getParvo(OutputArray retinaOutput_parvo)
611615
void RetinaImpl::getParvo(OutputArray retinaOutput_parvo)
612616
{
613617
CV_OCL_RUN((_ocl_retina != 0) && retinaOutput_parvo.isUMat(), ocl_getParvo(retinaOutput_parvo));
618+
CV_Assert(!_wasOCLRunCalled);
614619

615620
if (_retinaFilter->getColorMode())
616621
{
@@ -627,6 +632,7 @@ void RetinaImpl::getParvo(OutputArray retinaOutput_parvo)
627632
#ifdef HAVE_OPENCL
628633
bool RetinaImpl::ocl_getMagno(OutputArray retinaOutput_magno)
629634
{
635+
CV_Assert(_wasOCLRunCalled);
630636
_ocl_retina->getMagno(retinaOutput_magno);
631637
return true;
632638
}
@@ -635,6 +641,7 @@ bool RetinaImpl::ocl_getMagno(OutputArray retinaOutput_magno)
635641
void RetinaImpl::getMagno(OutputArray retinaOutput_magno)
636642
{
637643
CV_OCL_RUN((_ocl_retina != 0) && retinaOutput_magno.isUMat(), ocl_getMagno(retinaOutput_magno));
644+
CV_Assert(!_wasOCLRunCalled);
638645

639646
// reallocate output buffer (if necessary)
640647
_convertValarrayBuffer2cvMat(_retinaFilter->getMovingContours(), _retinaFilter->getOutputNBrows(), _retinaFilter->getOutputNBcolumns(), false, retinaOutput_magno);
@@ -644,6 +651,7 @@ void RetinaImpl::getMagno(OutputArray retinaOutput_magno)
644651
#ifdef HAVE_OPENCL
645652
bool RetinaImpl::ocl_getMagnoRAW(OutputArray magnoOutputBufferCopy)
646653
{
654+
CV_Assert(_wasOCLRunCalled);
647655
_ocl_retina->getMagnoRAW(magnoOutputBufferCopy);
648656
return true;
649657
}
@@ -653,7 +661,7 @@ bool RetinaImpl::ocl_getMagnoRAW(OutputArray magnoOutputBufferCopy)
653661
void RetinaImpl::getMagnoRAW(OutputArray magnoOutputBufferCopy){
654662

655663
CV_OCL_RUN((_ocl_retina != 0) && magnoOutputBufferCopy.isUMat(), ocl_getMagnoRAW(magnoOutputBufferCopy));
656-
664+
CV_Assert(!_wasOCLRunCalled);
657665
// get magno channel header
658666
const cv::Mat magnoChannel=cv::Mat(getMagnoRAW());
659667
// copy data
@@ -663,6 +671,7 @@ void RetinaImpl::getMagnoRAW(OutputArray magnoOutputBufferCopy){
663671
#ifdef HAVE_OPENCL
664672
bool RetinaImpl::ocl_getParvoRAW(OutputArray parvoOutputBufferCopy)
665673
{
674+
CV_Assert(_wasOCLRunCalled);
666675
_ocl_retina->getParvoRAW(parvoOutputBufferCopy);
667676
return true;
668677
}
@@ -671,7 +680,7 @@ bool RetinaImpl::ocl_getParvoRAW(OutputArray parvoOutputBufferCopy)
671680
void RetinaImpl::getParvoRAW(OutputArray parvoOutputBufferCopy){
672681

673682
CV_OCL_RUN((_ocl_retina != 0) && parvoOutputBufferCopy.isUMat(), ocl_getParvoRAW(parvoOutputBufferCopy));
674-
683+
CV_Assert(!_wasOCLRunCalled);
675684
// get parvo channel header
676685
const cv::Mat parvoChannel=cv::Mat(getParvoRAW());
677686
// copy data
@@ -680,12 +689,14 @@ void RetinaImpl::getParvoRAW(OutputArray parvoOutputBufferCopy){
680689

681690
// original API level data accessors : get buffers addresses...
682691
const Mat RetinaImpl::getMagnoRAW() const {
692+
CV_Assert(!_wasOCLRunCalled);
683693
// create a cv::Mat header for the valarray
684694
return Mat((int)_retinaFilter->getMovingContours().size(),1, CV_32F, (void*)get_data(_retinaFilter->getMovingContours()));
685695

686696
}
687697

688698
const Mat RetinaImpl::getParvoRAW() const {
699+
CV_Assert(!_wasOCLRunCalled);
689700
if (_retinaFilter->getColorMode()) // check if color mode is enabled
690701
{
691702
// create a cv::Mat table (for RGB planes as a single vector)
@@ -699,6 +710,7 @@ const Mat RetinaImpl::getParvoRAW() const {
699710
// private method called by constructors
700711
void RetinaImpl::_init(const cv::Size inputSz, const bool colorMode, int colorSamplingMethod, const bool useRetinaLogSampling, const float reductionFactor, const float samplingStrenght)
701712
{
713+
_wasOCLRunCalled = false;
702714
// basic error check
703715
if (inputSz.height*inputSz.width <= 0)
704716
throw cv::Exception(-1, "Bad retina size setup : size height and with must be superior to zero", "RetinaImpl::setup", "Retina.cpp", 0);

0 commit comments

Comments
 (0)