adding new flags to imread to load image reduced
authorSuleyman TURKMEN <sturkmen@hotmail.com>
Thu, 24 Sep 2015 19:51:11 +0000 (22:51 +0300)
committerSuleyman TURKMEN <sturkmen@hotmail.com>
Sun, 27 Sep 2015 23:00:02 +0000 (02:00 +0300)
modules/imgcodecs/include/opencv2/imgcodecs.hpp
modules/imgcodecs/src/loadsave.cpp

index e21db8e..678861b 100644 (file)
@@ -62,12 +62,18 @@ namespace cv
 
 //! Imread flags
 enum ImreadModes {
-       IMREAD_UNCHANGED  = -1, //!< If set, return the loaded image as is (with alpha channel, otherwise it gets cropped).
-       IMREAD_GRAYSCALE  = 0,  //!< If set, always convert image to the single channel grayscale image.
-       IMREAD_COLOR      = 1,  //!< If set, always convert image to the 3 channel BGR color image.
-       IMREAD_ANYDEPTH   = 2,  //!< If set, return 16-bit/32-bit image when the input has the corresponding depth, otherwise convert it to 8-bit.
-       IMREAD_ANYCOLOR   = 4,  //!< If set, the image is read in any possible color format.
-       IMREAD_LOAD_GDAL  = 8   //!< If set, use the gdal driver for loading the image.
+       IMREAD_UNCHANGED            = -1, //!< If set, return the loaded image as is (with alpha channel, otherwise it gets cropped).
+       IMREAD_GRAYSCALE            = 0,  //!< If set, always convert image to the single channel grayscale image.
+       IMREAD_COLOR                = 1,  //!< If set, always convert image to the 3 channel BGR color image.
+       IMREAD_ANYDEPTH             = 2,  //!< If set, return 16-bit/32-bit image when the input has the corresponding depth, otherwise convert it to 8-bit.
+       IMREAD_ANYCOLOR             = 4,  //!< If set, the image is read in any possible color format.
+       IMREAD_LOAD_GDAL            = 8,  //!< If set, use the gdal driver for loading the image.
+       IMREAD_GRAYSCALE_REDUCED_2  = 16, //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/2.
+       IMREAD_COLOR_REDUCED_2      = 17, //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/2.
+       IMREAD_GRAYSCALE_REDUCED_4  = 32, //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/4.
+       IMREAD_COLOR_REDUCED_4      = 33, //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/4.
+       IMREAD_GRAYSCALE_REDUCED_8  = 64, //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/8.
+       IMREAD_COLOR_REDUCED_8      = 65  //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/8.
      };
 
 //! Imwrite flags
@@ -133,14 +139,6 @@ returns an empty matrix ( Mat::data==NULL ). Currently, the following file forma
  */
 CV_EXPORTS_W Mat imread( const String& filename, int flags = IMREAD_COLOR );
 
-/** @brief Loads and resizes down an image from a file.
-@anchor imread_reduced
-@param filename Name of file to be loaded.
-@param flags Flag that can take values of @ref cv::ImreadModes
-@param scale_denom
- */
-CV_EXPORTS_W Mat imread_reduced( const String& filename, int flags = IMREAD_COLOR, int scale_denom=1 );
-
 /** @brief Loads a multi-page image from a file. (see imread for details.)
 
 @param filename Name of file to be loaded.
index a7bf46f..336777a 100644 (file)
@@ -238,7 +238,7 @@ enum { LOAD_CVMAT=0, LOAD_IMAGE=1, LOAD_MAT=2 };
  *
 */
 static void*
-imread_( const String& filename, int flags, int hdrtype, Mat* mat=0, int scale_denom=1 )
+imread_( const String& filename, int flags, int hdrtype, Mat* mat=0 )
 {
     IplImage* image = 0;
     CvMat *matrix = 0;
@@ -252,7 +252,7 @@ imread_( const String& filename, int flags, int hdrtype, Mat* mat=0, int scale_d
         decoder = GdalDecoder().newDecoder();
     }else{
 #endif
-        decoder = findDecoder(filename);
+        decoder = findDecoder( filename );
 #ifdef HAVE_GDAL
     }
 #endif
@@ -262,11 +262,22 @@ imread_( const String& filename, int flags, int hdrtype, Mat* mat=0, int scale_d
         return 0;
     }
 
+    int scale_denom = 1;
+    if( flags > IMREAD_LOAD_GDAL )
+    {
+    if( flags & IMREAD_GRAYSCALE_REDUCED_2 )
+        scale_denom = 2;
+    else if( flags & IMREAD_GRAYSCALE_REDUCED_4 )
+        scale_denom = 4;
+    else if( flags & IMREAD_GRAYSCALE_REDUCED_8 )
+        scale_denom = 8;
+    }
+
     /// set the scale_denom in the driver
     decoder->setScale( scale_denom );
 
     /// set the filename in the driver
-    decoder->setSource(filename);
+    decoder->setSource( filename );
 
    // read the header to make sure it succeeds
    if( !decoder->readHeader() )
@@ -296,7 +307,7 @@ imread_( const String& filename, int flags, int hdrtype, Mat* mat=0, int scale_d
         if( hdrtype == LOAD_CVMAT )
         {
             matrix = cvCreateMat( size.height, size.width, type );
-            temp = cvarrToMat(matrix);
+            temp = cvarrToMat( matrix );
         }
         else
         {
@@ -307,7 +318,7 @@ imread_( const String& filename, int flags, int hdrtype, Mat* mat=0, int scale_d
     else
     {
         image = cvCreateImage( size, cvIplDepth(type), CV_MAT_CN(type) );
-        temp = cvarrToMat(image);
+        temp = cvarrToMat( image );
     }
 
     // read the image data
@@ -320,10 +331,9 @@ imread_( const String& filename, int flags, int hdrtype, Mat* mat=0, int scale_d
         return 0;
     }
 
-    int testdecoder = decoder->setScale( scale_denom ); // if decoder is JpegDecoder then testdecoder will be 1
-    if( (scale_denom > 1 ) & ( testdecoder > 1 ) )
+    if( decoder->setScale( scale_denom ) > 1 ) // if decoder is JpegDecoder then decoder->setScale always returns 1
     {
-        resize(*mat,*mat,Size(size.width/scale_denom,size.height/scale_denom));
+        resize( *mat, *mat, Size( size.width / scale_denom, size.height / scale_denom ) );
     }
 
     return hdrtype == LOAD_CVMAT ? (void*)matrix :
@@ -422,27 +432,6 @@ Mat imread( const String& filename, int flags )
 }
 
 /**
- * Read an image and resize it
- *
- *  This function merely calls the actual implementation above and returns itself.
- *
- * @param[in] filename File to load
- * @param[in] flags Flags you wish to set.
- * @param[in] scale_denom Scale value
-*/
-Mat imread_reduced( const String& filename, int flags, int scale_denom )
-{
-    /// create the basic container
-    Mat img;
-
-    /// load the data
-    imread_( filename, flags, LOAD_MAT, &img, scale_denom );
-
-    /// return a reference to the data
-    return img;
-}
-
-/**
 * Read a multi-page image
 *
 *  This function merely calls the actual implementation above and returns itself.