@@ -293,6 +293,7 @@ class RetinaImpl : public Retina
293
293
bool _convertCvMat2ValarrayBuffer (InputArray inputMatToConvert, std::valarray<float > &outputValarrayMatrix);
294
294
295
295
296
+ bool _wasOCLRunCalled;
296
297
#ifdef HAVE_OPENCL
297
298
ocl::RetinaOCLImpl* _ocl_retina;
298
299
@@ -564,6 +565,7 @@ void RetinaImpl::setupIPLMagnoChannel(const bool normaliseOutput, const float pa
564
565
bool RetinaImpl::ocl_run (InputArray inputMatToConvert)
565
566
{
566
567
_ocl_retina->run (inputMatToConvert);
568
+ _wasOCLRunCalled = true ;
567
569
return true ;
568
570
}
569
571
#endif
@@ -572,6 +574,7 @@ void RetinaImpl::run(InputArray inputMatToConvert)
572
574
{
573
575
CV_OCL_RUN ((_ocl_retina != 0 ), ocl_run (inputMatToConvert));
574
576
577
+ _wasOCLRunCalled = false ;
575
578
// first convert input image to the compatible format : std::valarray<float>
576
579
const bool colorMode = _convertCvMat2ValarrayBuffer (inputMatToConvert.getMat (), _inputBuffer);
577
580
// process the retina
@@ -603,6 +606,7 @@ void RetinaImpl::applyFastToneMapping(InputArray inputImage, OutputArray outputT
603
606
#ifdef HAVE_OPENCL
604
607
bool RetinaImpl::ocl_getParvo (OutputArray retinaOutput_parvo)
605
608
{
609
+ CV_Assert (_wasOCLRunCalled);
606
610
_ocl_retina->getParvo (retinaOutput_parvo);
607
611
return true ;
608
612
}
@@ -611,6 +615,7 @@ bool RetinaImpl::ocl_getParvo(OutputArray retinaOutput_parvo)
611
615
void RetinaImpl::getParvo (OutputArray retinaOutput_parvo)
612
616
{
613
617
CV_OCL_RUN ((_ocl_retina != 0 ) && retinaOutput_parvo.isUMat (), ocl_getParvo (retinaOutput_parvo));
618
+ CV_Assert (!_wasOCLRunCalled);
614
619
615
620
if (_retinaFilter->getColorMode ())
616
621
{
@@ -627,6 +632,7 @@ void RetinaImpl::getParvo(OutputArray retinaOutput_parvo)
627
632
#ifdef HAVE_OPENCL
628
633
bool RetinaImpl::ocl_getMagno (OutputArray retinaOutput_magno)
629
634
{
635
+ CV_Assert (_wasOCLRunCalled);
630
636
_ocl_retina->getMagno (retinaOutput_magno);
631
637
return true ;
632
638
}
@@ -635,6 +641,7 @@ bool RetinaImpl::ocl_getMagno(OutputArray retinaOutput_magno)
635
641
void RetinaImpl::getMagno (OutputArray retinaOutput_magno)
636
642
{
637
643
CV_OCL_RUN ((_ocl_retina != 0 ) && retinaOutput_magno.isUMat (), ocl_getMagno (retinaOutput_magno));
644
+ CV_Assert (!_wasOCLRunCalled);
638
645
639
646
// reallocate output buffer (if necessary)
640
647
_convertValarrayBuffer2cvMat (_retinaFilter->getMovingContours (), _retinaFilter->getOutputNBrows (), _retinaFilter->getOutputNBcolumns (), false , retinaOutput_magno);
@@ -644,6 +651,7 @@ void RetinaImpl::getMagno(OutputArray retinaOutput_magno)
644
651
#ifdef HAVE_OPENCL
645
652
bool RetinaImpl::ocl_getMagnoRAW (OutputArray magnoOutputBufferCopy)
646
653
{
654
+ CV_Assert (_wasOCLRunCalled);
647
655
_ocl_retina->getMagnoRAW (magnoOutputBufferCopy);
648
656
return true ;
649
657
}
@@ -653,7 +661,7 @@ bool RetinaImpl::ocl_getMagnoRAW(OutputArray magnoOutputBufferCopy)
653
661
void RetinaImpl::getMagnoRAW (OutputArray magnoOutputBufferCopy){
654
662
655
663
CV_OCL_RUN ((_ocl_retina != 0 ) && magnoOutputBufferCopy.isUMat (), ocl_getMagnoRAW (magnoOutputBufferCopy));
656
-
664
+ CV_Assert (!_wasOCLRunCalled);
657
665
// get magno channel header
658
666
const cv::Mat magnoChannel=cv::Mat (getMagnoRAW ());
659
667
// copy data
@@ -663,6 +671,7 @@ void RetinaImpl::getMagnoRAW(OutputArray magnoOutputBufferCopy){
663
671
#ifdef HAVE_OPENCL
664
672
bool RetinaImpl::ocl_getParvoRAW (OutputArray parvoOutputBufferCopy)
665
673
{
674
+ CV_Assert (_wasOCLRunCalled);
666
675
_ocl_retina->getParvoRAW (parvoOutputBufferCopy);
667
676
return true ;
668
677
}
@@ -671,7 +680,7 @@ bool RetinaImpl::ocl_getParvoRAW(OutputArray parvoOutputBufferCopy)
671
680
void RetinaImpl::getParvoRAW (OutputArray parvoOutputBufferCopy){
672
681
673
682
CV_OCL_RUN ((_ocl_retina != 0 ) && parvoOutputBufferCopy.isUMat (), ocl_getParvoRAW (parvoOutputBufferCopy));
674
-
683
+ CV_Assert (!_wasOCLRunCalled);
675
684
// get parvo channel header
676
685
const cv::Mat parvoChannel=cv::Mat (getParvoRAW ());
677
686
// copy data
@@ -680,12 +689,14 @@ void RetinaImpl::getParvoRAW(OutputArray parvoOutputBufferCopy){
680
689
681
690
// original API level data accessors : get buffers addresses...
682
691
const Mat RetinaImpl::getMagnoRAW () const {
692
+ CV_Assert (!_wasOCLRunCalled);
683
693
// create a cv::Mat header for the valarray
684
694
return Mat ((int )_retinaFilter->getMovingContours ().size (),1 , CV_32F, (void *)get_data (_retinaFilter->getMovingContours ()));
685
695
686
696
}
687
697
688
698
const Mat RetinaImpl::getParvoRAW () const {
699
+ CV_Assert (!_wasOCLRunCalled);
689
700
if (_retinaFilter->getColorMode ()) // check if color mode is enabled
690
701
{
691
702
// create a cv::Mat table (for RGB planes as a single vector)
@@ -699,6 +710,7 @@ const Mat RetinaImpl::getParvoRAW() const {
699
710
// private method called by constructors
700
711
void RetinaImpl::_init (const cv::Size inputSz, const bool colorMode, int colorSamplingMethod, const bool useRetinaLogSampling, const float reductionFactor, const float samplingStrenght)
701
712
{
713
+ _wasOCLRunCalled = false ;
702
714
// basic error check
703
715
if (inputSz.height *inputSz.width <= 0 )
704
716
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