refactored exposure compensators (opencv_stitching)
authorAlexey Spizhevoy <no@email>
Sat, 28 May 2011 06:48:33 +0000 (06:48 +0000)
committerAlexey Spizhevoy <no@email>
Sat, 28 May 2011 06:48:33 +0000 (06:48 +0000)
modules/stitching/exposure_compensate.cpp
modules/stitching/exposure_compensate.hpp
modules/stitching/main.cpp
modules/stitching/precomp.hpp

index d91d573..4a923f4 100644 (file)
@@ -54,15 +54,23 @@ Ptr<ExposureCompensator> ExposureCompensator::createDefault(int type)
         return new NoExposureCompensator();
     if (type == OVERLAP)
         return new OverlapExposureCompensator();
-    if (type == SEGMENT)
-        return new SegmentExposureCompensator();
     CV_Error(CV_StsBadArg, "unsupported exposure compensation method");
     return NULL;\r
 }\r
 \r
 \r
+void ExposureCompensator::feed(const vector<Point> &corners, const vector<Mat> &images, \r
+                               const vector<Mat> &masks)\r
+{\r
+    vector<pair<Mat,uchar> > level_masks;\r
+    for (size_t i = 0; i < masks.size(); ++i)\r
+        level_masks.push_back(make_pair(masks[i], 255));\r
+    feed(corners, images, level_masks);\r
+}\r
+\r
+\r
 void OverlapExposureCompensator::feed(const vector<Point> &corners, const vector<Mat> &images, \r
-                                      const vector<Mat> &masks)\r
+                                      const vector<pair<Mat,uchar> > &masks)\r
 {\r
     CV_Assert(corners.size() == images.size() && images.size() == masks.size());\r
 \r
@@ -84,9 +92,9 @@ void OverlapExposureCompensator::feed(const vector<Point> &corners, const vector
                 subimg1 = images[i](Rect(roi.tl() - corners[i], roi.br() - corners[i]));\r
                 subimg2 = images[j](Rect(roi.tl() - corners[j], roi.br() - corners[j]));\r
 \r
-                submask1 = masks[i](Rect(roi.tl() - corners[i], roi.br() - corners[i]));\r
-                submask2 = masks[j](Rect(roi.tl() - corners[j], roi.br() - corners[j]));\r
-                intersect = submask1 & submask2;\r
+                submask1 = masks[i].first(Rect(roi.tl() - corners[i], roi.br() - corners[i]));\r
+                submask2 = masks[j].first(Rect(roi.tl() - corners[j], roi.br() - corners[j]));\r
+                intersect = (submask1 == masks[i].second) & (submask2 == masks[j].second);\r
 \r
                 N(i, j) = N(j, i) = countNonZero(intersect);\r
 \r
@@ -127,22 +135,11 @@ void OverlapExposureCompensator::feed(const vector<Point> &corners, const vector
         }\r
     }\r
 \r
-    solve(A, b, gains_);\r
+    solve(A, b, gains);\r
 }\r
 \r
 \r
 void OverlapExposureCompensator::apply(int index, Point /*corner*/, Mat &image, const Mat &/*mask*/)\r
 {\r
-    image *= gains_(index, 0);\r
+    image *= gains(index, 0);\r
 }\r
-\r
-\r
-void SegmentExposureCompensator::feed(const vector<Point> &/*corners*/, const vector<Mat> &/*images*/, \r
-                                      const vector<Mat> &/*masks*/)\r
-{\r
-}\r
-\r
-\r
-void SegmentExposureCompensator::apply(int /*index*/, Point /*corner*/, Mat &/*image*/, const Mat &/*mask*/)\r
-{\r
-}
\ No newline at end of file
index 5112bc5..a4d3cea 100644 (file)
@@ -51,8 +51,10 @@ public:
     enum { NO, OVERLAP, SEGMENT };
     static cv::Ptr<ExposureCompensator> createDefault(int type);
 
+    void feed(const std::vector<cv::Point> &corners, const std::vector<cv::Mat> &images, 
+              const std::vector<cv::Mat> &masks);
     virtual void feed(const std::vector<cv::Point> &corners, const std::vector<cv::Mat> &images, 
-                      const std::vector<cv::Mat> &masks) = 0;
+                      const std::vector<std::pair<cv::Mat,uchar> > &masks) = 0;
     virtual void apply(int index, cv::Point corner, cv::Mat &image, const cv::Mat &mask) = 0;
 };
 
@@ -61,7 +63,7 @@ class NoExposureCompensator : public ExposureCompensator
 {
 public:
     void feed(const std::vector<cv::Point> &/*corners*/, const std::vector<cv::Mat> &/*images*/, 
-              const std::vector<cv::Mat> &/*masks*/) {};
+              const std::vector<std::pair<cv::Mat,uchar> > &/*masks*/) {};
     void apply(int /*index*/, cv::Point /*corner*/, cv::Mat &/*image*/, const cv::Mat &/*mask*/) {};
 };
 
@@ -70,20 +72,10 @@ class OverlapExposureCompensator : public ExposureCompensator
 {
 public:
     void feed(const std::vector<cv::Point> &corners, const std::vector<cv::Mat> &images, 
-              const std::vector<cv::Mat> &masks);
+              const std::vector<std::pair<cv::Mat,uchar> > &masks);
     void apply(int index, cv::Point corner, cv::Mat &image, const cv::Mat &mask);
 
-private:
-    cv::Mat_<double> gains_;
-};
-
-
-class SegmentExposureCompensator : public ExposureCompensator
-{
-public:
-    void feed(const std::vector<cv::Point> &corners, const std::vector<cv::Mat> &images, 
-              const std::vector<cv::Mat> &masks);
-    void apply(int index, cv::Point corner, cv::Mat &image, const cv::Mat &mask);
+    cv::Mat_<double> gains;
 };
 
 #endif // __OPENCV_EXPOSURE_COMPENSATE_HPP__
\ No newline at end of file
index 4c22fb8..bba10a6 100644 (file)
@@ -201,8 +201,6 @@ int parseCmdArgs(int argc, char** argv)
                 expos_comp_type = ExposureCompensator::NO;\r
             else if (string(argv[i + 1]) == "overlap")\r
                 expos_comp_type = ExposureCompensator::OVERLAP;\r
-            else if (string(argv[i + 1]) == "segment")\r
-                expos_comp_type = ExposureCompensator::SEGMENT;\r
             else\r
             {\r
                 cout << "Bad exposure compensation method\n";\r
index e45a147..1223f92 100644 (file)
 #include "cvconfig.h"\r
 #endif\r
 \r
+#include <vector>\r
+#include <algorithm>\r
+#include <utility>\r
 #include "opencv2/core/core.hpp"\r
 #include "opencv2/core/internal.hpp"\r
 #include "opencv2/imgproc/imgproc.hpp"\r
-#include "gcgraph.hpp"\r
 #include "opencv2/highgui/highgui.hpp"\r
 #include "opencv2/features2d/features2d.hpp"\r
 #include "opencv2/calib3d/calib3d.hpp"\r
 #include "opencv2/gpu/gpu.hpp"\r
-#include <vector>\r
+#include "gcgraph.hpp"\r
 \r
 #endif\r