Skip to content

Commit ab43a3b

Browse files
author
Woody Chow
committed
Use TLS instead of mutex in SIFT
1 parent 6be2945 commit ab43a3b

File tree

1 file changed

+14
-10
lines changed

1 file changed

+14
-10
lines changed

modules/xfeatures2d/src/sift.cpp

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -585,8 +585,7 @@ class findScaleSpaceExtremaComputer : public ParallelLoopBody
585585
double _sigma,
586586
const std::vector<Mat>& _gauss_pyr,
587587
const std::vector<Mat>& _dog_pyr,
588-
std::vector<KeyPoint>& _keypoints,
589-
Mutex &_mutex)
588+
TLSData<std::vector<KeyPoint> > &_tls_kpts_struct)
590589

591590
: o(_o),
592591
i(_i),
@@ -600,8 +599,7 @@ class findScaleSpaceExtremaComputer : public ParallelLoopBody
600599
sigma(_sigma),
601600
gauss_pyr(_gauss_pyr),
602601
dog_pyr(_dog_pyr),
603-
keypoints(_keypoints),
604-
mutex(_mutex) { }
602+
tls_kpts_struct(_tls_kpts_struct) { }
605603
void operator()( const cv::Range& range ) const
606604
{
607605
const int begin = range.start;
@@ -614,6 +612,8 @@ class findScaleSpaceExtremaComputer : public ParallelLoopBody
614612
const Mat& prev = dog_pyr[idx-1];
615613
const Mat& next = dog_pyr[idx+1];
616614

615+
std::vector<KeyPoint> *tls_kpts = tls_kpts_struct.get();
616+
617617
KeyPoint kpt;
618618
for( int r = begin; r < end; r++)
619619
{
@@ -671,8 +671,7 @@ class findScaleSpaceExtremaComputer : public ParallelLoopBody
671671
if(std::abs(kpt.angle - 360.f) < FLT_EPSILON)
672672
kpt.angle = 0.f;
673673
{
674-
AutoLock autoLock(mutex);
675-
keypoints.push_back(kpt);
674+
tls_kpts->push_back(kpt);
676675
}
677676
}
678677
}
@@ -690,8 +689,7 @@ class findScaleSpaceExtremaComputer : public ParallelLoopBody
690689
double sigma;
691690
const std::vector<Mat>& gauss_pyr;
692691
const std::vector<Mat>& dog_pyr;
693-
std::vector<KeyPoint>& keypoints;
694-
Mutex &mutex;
692+
TLSData<std::vector<KeyPoint> > &tls_kpts_struct;
695693
};
696694

697695
//
@@ -704,7 +702,7 @@ void SIFT_Impl::findScaleSpaceExtrema( const std::vector<Mat>& gauss_pyr, const
704702
const int threshold = cvFloor(0.5 * contrastThreshold / nOctaveLayers * 255 * SIFT_FIXPT_SCALE);
705703

706704
keypoints.clear();
707-
Mutex mutex;
705+
TLSData<std::vector<KeyPoint> > tls_kpts_struct;
708706

709707
for( int o = 0; o < nOctaves; o++ )
710708
for( int i = 1; i <= nOctaveLayers; i++ )
@@ -721,8 +719,14 @@ void SIFT_Impl::findScaleSpaceExtrema( const std::vector<Mat>& gauss_pyr, const
721719
contrastThreshold,
722720
edgeThreshold,
723721
sigma,
724-
gauss_pyr, dog_pyr, keypoints, mutex));
722+
gauss_pyr, dog_pyr, tls_kpts_struct));
725723
}
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+
}
726730
}
727731

728732

0 commit comments

Comments
 (0)