restore support of vector<float> as possible output descriptor container in SURF...
authorVadim Pisarevsky <no@email>
Wed, 4 Apr 2012 10:36:49 +0000 (10:36 +0000)
committerVadim Pisarevsky <no@email>
Wed, 4 Apr 2012 10:36:49 +0000 (10:36 +0000)
modules/nonfree/src/surf.cpp

index 3b35136..e301f96 100644 (file)
@@ -877,16 +877,29 @@ void SURF::operator()(InputArray _img, InputArray _mask,
     if( N > 0 )
     {
         Mat descriptors;
+        bool _1d = false;
+        int dcols = extended ? 128 : 64;
+        size_t dsize = dcols*sizeof(float);
+        
         if( doDescriptors )
         {
-            _descriptors.create((int)keypoints.size(), (extended ? 128 : 64), CV_32F);
-            descriptors = _descriptors.getMat();
+            _1d = _descriptors.kind() == _InputArray::STD_VECTOR && _descriptors.type() == CV_32F;
+            if( _1d )
+            {
+                _descriptors.create(N*dcols, 1, CV_32F);
+                descriptors = _descriptors.getMat().reshape(1, N);
+            }
+            else
+            {
+                _descriptors.create(N, dcols, CV_32F);
+                descriptors = _descriptors.getMat();
+            }
         }
         
+        // we call SURFInvoker in any case, even if we do not need descriptors,
+        // since it computes orientation of each feature.
         parallel_for(BlockedRange(0, N), SURFInvoker(img, sum, keypoints, descriptors, extended, upright) );
         
-        size_t dsize = descriptors.cols*descriptors.elemSize();
-    
         // remove keypoints that were marked for deletion
         for( i = j = 0; i < N; i++ )
         {
@@ -908,6 +921,8 @@ void SURF::operator()(InputArray _img, InputArray _mask,
             if( doDescriptors )
             {
                 Mat d = descriptors.rowRange(0, N);
+                if( _1d )
+                    d = d.reshape(1, N*dcols);
                 d.copyTo(_descriptors);
             }
         }