Added imreadmulti API to read multi-paged images into a vector of Mat.
This commit is contained in:
parent
ecf359b8c9
commit
61ca38103c
@ -134,6 +134,16 @@ returns an empty matrix ( Mat::data==NULL ). Currently, the following file forma
|
|||||||
*/
|
*/
|
||||||
CV_EXPORTS_W Mat imread( const String& filename, int flags = IMREAD_COLOR );
|
CV_EXPORTS_W Mat imread( const String& filename, int flags = IMREAD_COLOR );
|
||||||
|
|
||||||
|
/** @brief Loads a multi-page image from a file. (see imread for details.)
|
||||||
|
|
||||||
|
@param filename Name of file to be loaded.
|
||||||
|
@param flags Flags specifying the color type of a loaded image (see imread).
|
||||||
|
Defaults to IMREAD_ANYCOLOR, as each page may be different.
|
||||||
|
@param mats A vector of Mat objects holding each page, if more than one.
|
||||||
|
|
||||||
|
*/
|
||||||
|
CV_EXPORTS_W bool imreadmulti(const String& filename, std::vector<Mat>& mats, int flags = IMREAD_ANYCOLOR);
|
||||||
|
|
||||||
/** @brief Saves an image to a specified file.
|
/** @brief Saves an image to a specified file.
|
||||||
|
|
||||||
@param filename Name of the file.
|
@param filename Name of the file.
|
||||||
|
@ -320,6 +320,84 @@ imread_( const String& filename, int flags, int hdrtype, Mat* mat=0 )
|
|||||||
hdrtype == LOAD_IMAGE ? (void*)image : (void*)mat;
|
hdrtype == LOAD_IMAGE ? (void*)image : (void*)mat;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read an image into memory and return the information
|
||||||
|
*
|
||||||
|
* @param[in] filename File to load
|
||||||
|
* @param[in] flags Flags
|
||||||
|
* @param[in] mats Reference to C++ vector<Mat> object to hold the images
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static bool
|
||||||
|
imreadmulti_(const String& filename, int flags, std::vector<Mat>& mats)
|
||||||
|
{
|
||||||
|
/// Search for the relevant decoder to handle the imagery
|
||||||
|
ImageDecoder decoder;
|
||||||
|
|
||||||
|
#ifdef HAVE_GDAL
|
||||||
|
if ((flags & IMREAD_LOAD_GDAL) == IMREAD_LOAD_GDAL){
|
||||||
|
decoder = GdalDecoder().newDecoder();
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
#endif
|
||||||
|
decoder = findDecoder(filename);
|
||||||
|
#ifdef HAVE_GDAL
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/// if no decoder was found, return nothing.
|
||||||
|
if (!decoder){
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// set the filename in the driver
|
||||||
|
decoder->setSource(filename);
|
||||||
|
|
||||||
|
// read the header to make sure it succeeds
|
||||||
|
if (!decoder->readHeader())
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
// grab the decoded type
|
||||||
|
int type = decoder->type();
|
||||||
|
if (flags != -1)
|
||||||
|
{
|
||||||
|
if ((flags & CV_LOAD_IMAGE_ANYDEPTH) == 0)
|
||||||
|
type = CV_MAKETYPE(CV_8U, CV_MAT_CN(type));
|
||||||
|
|
||||||
|
if ((flags & CV_LOAD_IMAGE_COLOR) != 0 ||
|
||||||
|
((flags & CV_LOAD_IMAGE_ANYCOLOR) != 0 && CV_MAT_CN(type) > 1))
|
||||||
|
type = CV_MAKETYPE(CV_MAT_DEPTH(type), 3);
|
||||||
|
else
|
||||||
|
type = CV_MAKETYPE(CV_MAT_DEPTH(type), 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// established the required input image size.
|
||||||
|
CvSize size;
|
||||||
|
size.width = decoder->width();
|
||||||
|
size.height = decoder->height();
|
||||||
|
|
||||||
|
Mat mat;
|
||||||
|
mat.create(size.height, size.width, type);
|
||||||
|
|
||||||
|
// read the image data
|
||||||
|
if (!decoder->readData(mat))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
mats.push_back(mat);
|
||||||
|
if (!decoder->nextPage())
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return !mats.empty();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read an image
|
* Read an image
|
||||||
*
|
*
|
||||||
@ -340,6 +418,21 @@ Mat imread( const String& filename, int flags )
|
|||||||
return img;
|
return img;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read a multi-page image
|
||||||
|
*
|
||||||
|
* This function merely calls the actual implementation above and returns itself.
|
||||||
|
*
|
||||||
|
* @param[in] filename File to load
|
||||||
|
* @param[in] mats Reference to C++ vector<Mat> object to hold the images
|
||||||
|
* @param[in] flags Flags you wish to set.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
bool imreadmulti(const String& filename, std::vector<Mat>& mats, int flags)
|
||||||
|
{
|
||||||
|
return imreadmulti_(filename, flags, mats);
|
||||||
|
}
|
||||||
|
|
||||||
static bool imwrite_( const String& filename, const Mat& image,
|
static bool imwrite_( const String& filename, const Mat& image,
|
||||||
const std::vector<int>& params, bool flipv )
|
const std::vector<int>& params, bool flipv )
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user