@@ -27,12 +27,18 @@ namespace xfeatures2d
2727
2828// Struct containing the 6 parameters that define an Average Box weak-learner
2929struct ABWLParams
30+ {
31+ int x1, y1, x2, y2, boxRadius, th;
32+ };
33+ // Same as previous with floating point threshold
34+ struct ABWLParamsFloatTh
3035{
3136 int x1, y1, x2, y2, boxRadius;
3237 float th;
3338};
3439
3540// BEBLID implementation
41+ template <class WeakLearnerT >
3642class BEBLID_Impl CV_FINAL: public BEBLID
3743{
3844public:
@@ -56,26 +62,26 @@ class BEBLID_Impl CV_FINAL: public BEBLID
5662 void compute (InputArray image, vector<KeyPoint> &keypoints, OutputArray descriptors) CV_OVERRIDE;
5763
5864private:
59- std::vector<ABWLParams > wl_params_;
65+ std::vector<WeakLearnerT > wl_params_;
6066 float scale_factor_;
6167 cv::Size patch_size_;
6268
63- void computeBEBLID (const cv::Mat &integralImg,
64- const std::vector<cv::KeyPoint> &keypoints,
65- cv::Mat &descriptors);
69+ void computeBoxDiffsDescriptor (const cv::Mat &integralImg,
70+ const std::vector<cv::KeyPoint> &keypoints,
71+ cv::Mat &descriptors);
6672}; // END BEBLID_Impl CLASS
6773
6874
69- // BAD implementation
70- class BAD_Impl CV_FINAL: public BAD
75+ // TEBLID implementation
76+ class TEBLID_Impl CV_FINAL: public TEBLID
7177{
7278public:
7379
7480 // constructor
75- explicit BAD_Impl (float scale_factor, int n_bits = BAD ::SIZE_256_BITS) : impl(scale_factor, n_bits){}
81+ explicit TEBLID_Impl (float scale_factor, int n_bits = TEBLID ::SIZE_256_BITS) : impl(scale_factor, n_bits){}
7682
7783 // destructor
78- ~BAD_Impl () CV_OVERRIDE = default ;
84+ ~TEBLID_Impl () CV_OVERRIDE = default ;
7985
8086 // returns the descriptor length in bytes
8187 int descriptorSize () const CV_OVERRIDE { return impl.descriptorSize (); }
@@ -93,12 +99,12 @@ class BAD_Impl CV_FINAL: public BAD
9399 }
94100
95101private:
96- BEBLID_Impl impl;
97- }; // END BAD_Impl CLASS
102+ BEBLID_Impl<ABWLParamsFloatTh> impl;
103+ }; // END TEBLID_Impl CLASS
98104
99- Ptr<BAD> BAD ::create (float scale_factor, int n_bits)
105+ Ptr<TEBLID> TEBLID ::create (float scale_factor, int n_bits)
100106{
101- return makePtr<BAD_Impl >(scale_factor, n_bits);
107+ return makePtr<TEBLID_Impl >(scale_factor, n_bits);
102108}
103109
104110/* *
@@ -137,8 +143,9 @@ static inline bool isKeypointInTheBorder(const cv::KeyPoint &kp,
137143 * @param scaleFactor A scale factor that magnifies the measurement functions w.r.t. the keypoint.
138144 * @param patchSize The size of the normalized patch where the measurement functions were learnt.
139145 */
140- static inline void rectifyABWL (const std::vector<ABWLParams> &wlPatchParams,
141- std::vector<ABWLParams> &wlImageParams,
146+ template < typename WeakLearnerT>
147+ static inline void rectifyABWL (const std::vector<WeakLearnerT> &wlPatchParams,
148+ std::vector<WeakLearnerT> &wlImageParams,
142149 const cv::KeyPoint &kp,
143150 float scaleFactor = 1 ,
144151 const cv::Size &patchSize = cv::Size(32 , 32 ))
@@ -188,7 +195,8 @@ static inline void rectifyABWL(const std::vector<ABWLParams> &wlPatchParams,
188195 * @param integralImage The integral image used to compute the average gray value in the square regions.
189196 * @return The difference of gray level in the two squares defined by wlImageParams
190197 */
191- static inline float computeABWLResponse (const ABWLParams &wlImageParams,
198+ template <typename WeakLearnerT>
199+ static inline float computeABWLResponse (const WeakLearnerT &wlImageParams,
192200 const cv::Mat &integralImage)
193201{
194202 CV_DbgAssert (!integralImage.empty ());
@@ -276,7 +284,8 @@ static inline float computeABWLResponse(const ABWLParams &wlImageParams,
276284}
277285
278286// descriptor computation using keypoints
279- void BEBLID_Impl::compute (InputArray _image, vector<KeyPoint> &keypoints, OutputArray _descriptors)
287+ template <class WeakLearnerT >
288+ void BEBLID_Impl<WeakLearnerT>::compute(InputArray _image, vector<KeyPoint> &keypoints, OutputArray _descriptors)
280289{
281290 Mat image = _image.getMat ();
282291
@@ -318,45 +327,54 @@ void BEBLID_Impl::compute(InputArray _image, vector<KeyPoint> &keypoints, Output
318327 CV_DbgAssert (descriptors.type () == CV_8UC1);
319328
320329 // Compute the BEBLID descriptors
321- computeBEBLID (integralImg, keypoints, descriptors);
330+ computeBoxDiffsDescriptor (integralImg, keypoints, descriptors);
322331}
323332
324333// constructor
325- BEBLID_Impl::BEBLID_Impl (float scale_factor, int n_bits)
334+ template <class WeakLearnerT >
335+ BEBLID_Impl<WeakLearnerT>::BEBLID_Impl(float scale_factor, int n_bits)
326336 : scale_factor_(scale_factor), patch_size_(32 , 32 )
327337{
338+ WeakLearnerT * begin_ptr, * end_ptr;
328339 if (n_bits == BEBLID::SIZE_512_BITS)
329340 {
330341 #include " beblid.p512.hpp"
331- wl_params_.assign (wl_params_512, wl_params_512 + sizeof (wl_params_512) / sizeof (wl_params_512[0 ]));
342+ begin_ptr = (WeakLearnerT *) std::begin (beblid_wl_params_512);
343+ end_ptr = (WeakLearnerT *) std::end (beblid_wl_params_512);
332344 }
333345 else if (n_bits == BEBLID::SIZE_256_BITS)
334346 {
335347 #include " beblid.p256.hpp"
336- wl_params_.assign (wl_params_256, wl_params_256 + sizeof (wl_params_256) / sizeof (wl_params_256[0 ]));
348+ begin_ptr = (WeakLearnerT *) std::begin (beblid_wl_params_256);
349+ end_ptr = (WeakLearnerT *) std::end (beblid_wl_params_256);
337350 }
338- else if (n_bits == BAD ::SIZE_512_BITS)
351+ else if (n_bits == TEBLID ::SIZE_512_BITS)
339352 {
340- #include " bad.p512.hpp"
341- wl_params_.assign (bad_params_512, bad_params_512 + sizeof (bad_params_512) / sizeof (bad_params_512[0 ]));
353+ #include " teblid.p512.hpp"
354+
355+ begin_ptr = (WeakLearnerT *) std::begin (teblid_wl_params_512);
356+ end_ptr = (WeakLearnerT *) std::end (teblid_wl_params_512);
342357 }
343- else if (n_bits == BAD ::SIZE_256_BITS)
358+ else if (n_bits == TEBLID ::SIZE_256_BITS)
344359 {
345- #include " bad.p256.hpp"
346- wl_params_.assign (bad_params_256, bad_params_256 + sizeof (bad_params_256) / sizeof (bad_params_256[0 ]));
360+ #include " teblid.p256.hpp"
361+
362+ begin_ptr = (WeakLearnerT *) std::begin (teblid_wl_params_256);
363+ end_ptr = (WeakLearnerT *) std::end (teblid_wl_params_256);
347364 }
348365 else
349366 {
350- CV_Error (Error::StsBadArg, " n_bits should be either BAD ::SIZE_512_BITS, BAD ::SIZE_256_BITS, "
367+ CV_Error (Error::StsBadArg, " n_bits should be either TEBLID ::SIZE_512_BITS, TEBLID ::SIZE_256_BITS, "
351368 " BEBLID::SIZE_512_BITS or BEBLID::SIZE_256_BITS" );
352369 }
353-
370+ wl_params_. assign (begin_ptr, end_ptr);
354371}
355372
356373// Internal function that implements the core of BEBLID descriptor
357- void BEBLID_Impl::computeBEBLID (const cv::Mat &integralImg,
358- const std::vector<cv::KeyPoint> &keypoints,
359- cv::Mat &descriptors)
374+ template <class WeakLearnerT >
375+ void BEBLID_Impl<WeakLearnerT>::computeBoxDiffsDescriptor(const cv::Mat &integralImg,
376+ const std::vector<cv::KeyPoint> &keypoints,
377+ cv::Mat &descriptors)
360378{
361379 CV_DbgAssert (!integralImg.empty ());
362380 CV_DbgAssert (size_t (descriptors.rows ) == keypoints.size ());
@@ -371,13 +389,13 @@ void BEBLID_Impl::computeBEBLID(const cv::Mat &integralImg,
371389#endif
372390 {
373391 // Get a pointer to the first element in the range
374- ABWLParams *wl;
392+ WeakLearnerT *wl;
375393 float responseFun;
376394 int areaResponseFun, kpIdx;
377395 size_t wlIdx;
378396 int box1x1, box1y1, box1x2, box1y2, box2x1, box2y1, box2x2, box2y2, bit_idx, side;
379397 uchar byte = 0 ;
380- std::vector<ABWLParams > imgWLParams (wl_params_.size ());
398+ std::vector<WeakLearnerT > imgWLParams (wl_params_.size ());
381399 uchar *d = &descriptors.at <uchar>(range.start , 0 );
382400
383401 for (kpIdx = range.start ; kpIdx < range.end ; kpIdx++)
@@ -452,7 +470,7 @@ void BEBLID_Impl::computeBEBLID(const cv::Mat &integralImg,
452470
453471Ptr<BEBLID> BEBLID::create (float scale_factor, int n_bits)
454472{
455- return makePtr<BEBLID_Impl>(scale_factor, n_bits);
473+ return makePtr<BEBLID_Impl<ABWLParams> >(scale_factor, n_bits);
456474}
457475} // END NAMESPACE XFEATURES2D
458476} // END NAMESPACE CV
0 commit comments