@@ -585,8 +585,7 @@ class findScaleSpaceExtremaComputer : public ParallelLoopBody
585
585
double _sigma,
586
586
const std::vector<Mat>& _gauss_pyr,
587
587
const std::vector<Mat>& _dog_pyr,
588
- std::vector<KeyPoint>& _keypoints,
589
- Mutex &_mutex)
588
+ TLSData<std::vector<KeyPoint> > &_tls_kpts_struct)
590
589
591
590
: o(_o),
592
591
i (_i),
@@ -600,8 +599,7 @@ class findScaleSpaceExtremaComputer : public ParallelLoopBody
600
599
sigma(_sigma),
601
600
gauss_pyr(_gauss_pyr),
602
601
dog_pyr(_dog_pyr),
603
- keypoints(_keypoints),
604
- mutex(_mutex) { }
602
+ tls_kpts_struct(_tls_kpts_struct) { }
605
603
void operator ()( const cv::Range& range ) const
606
604
{
607
605
const int begin = range.start ;
@@ -614,6 +612,8 @@ class findScaleSpaceExtremaComputer : public ParallelLoopBody
614
612
const Mat& prev = dog_pyr[idx-1 ];
615
613
const Mat& next = dog_pyr[idx+1 ];
616
614
615
+ std::vector<KeyPoint> *tls_kpts = tls_kpts_struct.get ();
616
+
617
617
KeyPoint kpt;
618
618
for ( int r = begin; r < end; r++)
619
619
{
@@ -671,8 +671,7 @@ class findScaleSpaceExtremaComputer : public ParallelLoopBody
671
671
if (std::abs (kpt.angle - 360 .f ) < FLT_EPSILON)
672
672
kpt.angle = 0 .f ;
673
673
{
674
- AutoLock autoLock (mutex);
675
- keypoints.push_back (kpt);
674
+ tls_kpts->push_back (kpt);
676
675
}
677
676
}
678
677
}
@@ -690,8 +689,7 @@ class findScaleSpaceExtremaComputer : public ParallelLoopBody
690
689
double sigma;
691
690
const std::vector<Mat>& gauss_pyr;
692
691
const std::vector<Mat>& dog_pyr;
693
- std::vector<KeyPoint>& keypoints;
694
- Mutex &mutex;
692
+ TLSData<std::vector<KeyPoint> > &tls_kpts_struct;
695
693
};
696
694
697
695
//
@@ -704,7 +702,7 @@ void SIFT_Impl::findScaleSpaceExtrema( const std::vector<Mat>& gauss_pyr, const
704
702
const int threshold = cvFloor (0.5 * contrastThreshold / nOctaveLayers * 255 * SIFT_FIXPT_SCALE);
705
703
706
704
keypoints.clear ();
707
- Mutex mutex ;
705
+ TLSData<std::vector<KeyPoint> > tls_kpts_struct ;
708
706
709
707
for ( int o = 0 ; o < nOctaves; o++ )
710
708
for ( int i = 1 ; i <= nOctaveLayers; i++ )
@@ -721,8 +719,14 @@ void SIFT_Impl::findScaleSpaceExtrema( const std::vector<Mat>& gauss_pyr, const
721
719
contrastThreshold,
722
720
edgeThreshold,
723
721
sigma,
724
- gauss_pyr, dog_pyr, keypoints, mutex ));
722
+ gauss_pyr, dog_pyr, tls_kpts_struct ));
725
723
}
724
+
725
+ std::vector<std::vector<KeyPoint>*> kpt_vecs;
726
+ tls_kpts_struct.gather (kpt_vecs);
727
+ for (size_t i = 0 ; i < kpt_vecs.size (); ++i) {
728
+ keypoints.insert (keypoints.end (), kpt_vecs[i]->begin (), kpt_vecs[i]->end ());
729
+ }
726
730
}
727
731
728
732
0 commit comments