[Benjamin Piwowarski] Renamed "foreach" macro into "bforeach" to avoid conflicts...
[libdai.git] / examples / example_imagesegmentation.cpp
index dc9b3da..fb5c57e 100644 (file)
@@ -1,17 +1,14 @@
 /*  This file is part of libDAI - http://www.libdai.org/
  *
- *  libDAI is licensed under the terms of the GNU General Public License version
- *  2, or (at your option) any later version. libDAI is distributed without any
- *  warranty. See the file COPYING for more details.
+ *  Copyright (c) 2006-2011, The libDAI authors. All rights reserved.
  *
- *  Copyright (C) 2006-2010  Joris Mooij  [joris dot mooij at libdai dot org]
- *  Copyright (C) 2006-2007  Radboud University Nijmegen, The Netherlands
+ *  Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
  */
 
 
 #include <iostream>
 #include <dai/alldai.h>  // Include main libDAI header file
-#include <CImg.h>        // This example needs a recent version of CImg to be installed
+#include <CImg.h>        // This example needs CImg to be installed
 
 
 using namespace dai;
@@ -37,8 +34,13 @@ FactorGraph img2fg( const CImg<T> &img, double J, double th_min, double th_max,
     vector<Var> vars;
     vector<Factor> factors;
 
+#ifndef NEW_CIMG
+    size_t dimx = img.width;   // Width of the image in pixels
+    size_t dimy = img.height;  // Height of the image in pixels
+#else
     size_t dimx = img.width();   // Width of the image in pixels
     size_t dimy = img.height();  // Height of the image in pixels
+#endif
     size_t N = dimx * dimy;      // One variable for each pixel
 
     // Create variables
@@ -168,10 +170,14 @@ double doInference( FactorGraph& fg, string algOpts, size_t maxIter, double tol,
             }
 
         // Display the image with the current beliefs
+#ifndef NEW_CIMG
+        disp << image;
+#else
         disp = image;
+#endif
 
-        // Perform the requested inference algorithm
-        // (which could be limited to perform only 1 iteration)
+        // Perform the requested inference algorithm for only one step
+        ia->setMaxIter( iter + 1 );
         maxDiff = ia->run();
 
         // Output progress
@@ -222,10 +228,17 @@ int main(int argc,char **argv) {
     CImg<unsigned char> image2 = CImg<>( file_i2 );
 
     // Check image sizes
+#ifndef NEW_CIMG
+    if( (image1.width != image2.width) || (image1.height != image2.height) )
+        cerr << "Error: input images should have same size." << endl;
+    size_t dimx = image1.width;
+    size_t dimy = image1.height;
+#else
     if( (image1.width() != image2.width()) || (image1.height() != image2.height()) )
         cerr << "Error: input images should have same size." << endl;
     size_t dimx = image1.width();
     size_t dimy = image1.height();
+#endif
 
     // Display input images
     cout << "Displaying input image 1..." << endl;
@@ -245,9 +258,15 @@ int main(int argc,char **argv) {
     for( size_t i = 0; i < dimx; i++ ) {
         for( size_t j = 0; j < dimy; j++ ) {
             int avg = 0;
+#ifndef NEW_CIMG
+            for( int c = 0; c < image1.dimv(); c++ )
+                avg += image1( i, j, c );
+            avg /= image1.dimv();
+#else
             for( int c = 0; c < image1.spectrum(); c++ )
                 avg += image1( i, j, c );
             avg /= image1.spectrum();
+#endif
             image3( i, j, 0 ) /= (1.0 + avg / 255.0);
         }
     }
@@ -288,8 +307,13 @@ int main(int argc,char **argv) {
                 image4(i,j,1) = image2(i,j,1);
                 image4(i,j,2) = image2(i,j,2);
             } else
+#ifndef NEW_CIMG
+                for( size_t c = 0; c < (size_t)image4.dimv(); c++ )
+                    image4(i,j,c) = 255;
+#else
                 for( size_t c = 0; c < (size_t)image4.spectrum(); c++ )
                     image4(i,j,c) = 255;
+#endif
         }
     cout << "Displaying the final result of the segmentation problem..." << endl;
     CImgDisplay main_disp( image4, "Foreground/background segmentation result", 0 );
@@ -298,8 +322,13 @@ int main(int argc,char **argv) {
     image4.save_jpeg( file_o2, 100 );
 
     cout << "Close the last image display in order to finish." << endl;
+#ifndef NEW_CIMG
+    while( !main_disp.is_closed )
+        cimg::wait( 40 );
+#else
     while( !main_disp.is_closed() )
         cimg::wait( 40 );
+#endif
 
     return 0;
 }