fixed some bugs in opencv_stitching
authorAlexey Spizhevoy <no@email>
Wed, 25 May 2011 12:36:14 +0000 (12:36 +0000)
committerAlexey Spizhevoy <no@email>
Wed, 25 May 2011 12:36:14 +0000 (12:36 +0000)
modules/stitching/autocalib.cpp
modules/stitching/exposure_compensate.cpp
modules/stitching/main.cpp
modules/stitching/matchers.cpp

index c6cd712..de1c5ef 100644 (file)
@@ -110,7 +110,7 @@ void estimateFocal(const vector<ImageFeatures> &features, const vector<MatchesIn
     }
     else
     {
-        nth_element(all_focals.begin(), all_focals.end(), all_focals.begin() + all_focals.size()/2);
+        nth_element(all_focals.begin(), all_focals.begin() + all_focals.size()/2, all_focals.end());
         for (int i = 0; i < num_images; ++i)
             focals[i] = all_focals[all_focals.size()/2];
     }
index db2cbc2..040b6a8 100644 (file)
@@ -62,7 +62,7 @@ void OverlapExposureCompensator::feed(const vector<Point> &corners, const vector
                                       const vector<Mat> &masks)\r
 {\r
     const int num_images = static_cast<int>(images.size());\r
-    Mat_<double> N(num_images, num_images); N.setTo(0);\r
+    Mat_<int> N(num_images, num_images); N.setTo(0);\r
     Mat_<double> I(num_images, num_images); I.setTo(0);\r
 \r
     Rect dst_roi = resultRoi(corners, images);\r
@@ -99,8 +99,8 @@ void OverlapExposureCompensator::feed(const vector<Point> &corners, const vector
                         }\r
                     }\r
                 }\r
-                I(i, j) = Isum1 / N(i, j);\r
-                I(j, i) = Isum2 / N(i, j);\r
+                I(i, j) = Isum1 / max(N(i, j), 1);\r
+                I(j, i) = Isum2 / max(N(i, j), 1);\r
             }\r
         }\r
     }\r
index 3856c8d..9ed74c7 100644 (file)
@@ -341,8 +341,13 @@ int main(int argc, char* argv[])
     vector<Mat> img_subset;\r
     vector<string> img_names_subset;\r
     for (size_t i = 0; i < indices.size(); ++i)\r
+    {\r
         img_names_subset.push_back(img_names[indices[i]]);\r
+        img_subset.push_back(images[indices[i]]);\r
+    }\r
+\r
     img_names = img_names_subset;\r
+    images = img_subset;\r
 \r
     // Check if we still have enough images\r
     num_images = static_cast<int>(img_names.size());\r
@@ -393,7 +398,7 @@ int main(int argc, char* argv[])
         LOGLN("Camera #" << i << " focal length: " << cameras[i].focal);\r
         focals.push_back(cameras[i].focal);\r
     }\r
-    nth_element(focals.begin(), focals.end(), focals.begin() + focals.size() / 2);\r
+    nth_element(focals.begin(), focals.begin() + focals.size()/2, focals.end());\r
     float warped_image_scale = static_cast<float>(focals[focals.size() / 2]);\r
 \r
     LOGLN("Warping images (auxiliary)... ");\r
index 2a396c9..69088c1 100644 (file)
@@ -265,7 +265,7 @@ void FeaturesMatcher::operator ()(const vector<ImageFeatures> &features, vector<
 
         // Leave k-nearest images
         int k = min(4, num_images);
-        nth_element(dists.begin(), dists.end(), dists.begin() + k);
+        nth_element(dists.begin(), dists.begin() + k, dists.end());
         for (int j = 0; j < k; ++j)
             is_near(i, dists[j].idx) = 1;
     }
@@ -273,7 +273,7 @@ void FeaturesMatcher::operator ()(const vector<ImageFeatures> &features, vector<
     vector<pair<int,int> > near_pairs;
     for (int i = 0; i < num_images - 1; ++i)
         for (int j = i + 1; j < num_images; ++j)
-            if (is_near(i, j))
+            if (is_near(i, j) || is_near(j, i))
                 near_pairs.push_back(make_pair(i, j));
 
     pairwise_matches.resize(num_images * num_images);