mirror of
https://github.com/opencv/opencv.git
synced 2024-11-24 03:00:14 +08:00
Merge pull request #25814 from sturkmen72:numFrames
add getFrameCount() member function to BaseImageDecoder
This commit is contained in:
commit
eab21b6106
@ -307,9 +307,11 @@ CV_EXPORTS_W bool imreadmulti(const String& filename, CV_OUT std::vector<Mat>& m
|
|||||||
|
|
||||||
/** @brief Returns the number of images inside the given file
|
/** @brief Returns the number of images inside the given file
|
||||||
|
|
||||||
The function imcount will return the number of pages in a multi-page image, or 1 for single-page images
|
The function imcount returns the number of pages in a multi-page image (e.g. TIFF), the number of frames in an animation (e.g. AVIF), and 1 otherwise.
|
||||||
|
If the image cannot be decoded, 0 is returned.
|
||||||
@param filename Name of file to be loaded.
|
@param filename Name of file to be loaded.
|
||||||
@param flags Flag that can take values of cv::ImreadModes, default with cv::IMREAD_ANYCOLOR.
|
@param flags Flag that can take values of cv::ImreadModes, default with cv::IMREAD_ANYCOLOR.
|
||||||
|
@todo when cv::IMREAD_LOAD_GDAL flag used the return value will be 0 or 1 because OpenCV's GDAL decoder doesn't support multi-page reading yet.
|
||||||
*/
|
*/
|
||||||
CV_EXPORTS_W size_t imcount(const String& filename, int flags = IMREAD_ANYCOLOR);
|
CV_EXPORTS_W size_t imcount(const String& filename, int flags = IMREAD_ANYCOLOR);
|
||||||
|
|
||||||
|
@ -195,6 +195,7 @@ bool AvifDecoder::readHeader() {
|
|||||||
|
|
||||||
m_width = decoder_->image->width;
|
m_width = decoder_->image->width;
|
||||||
m_height = decoder_->image->height;
|
m_height = decoder_->image->height;
|
||||||
|
m_frame_count = decoder_->imageCount;
|
||||||
channels_ = (decoder_->image->yuvFormat == AVIF_PIXEL_FORMAT_YUV400) ? 1 : 3;
|
channels_ = (decoder_->image->yuvFormat == AVIF_PIXEL_FORMAT_YUV400) ? 1 : 3;
|
||||||
if (decoder_->alphaPresent) ++channels_;
|
if (decoder_->alphaPresent) ++channels_;
|
||||||
bit_depth_ = decoder_->image->depth;
|
bit_depth_ = decoder_->image->depth;
|
||||||
|
@ -54,6 +54,7 @@ BaseImageDecoder::BaseImageDecoder()
|
|||||||
m_buf_supported = false;
|
m_buf_supported = false;
|
||||||
m_scale_denom = 1;
|
m_scale_denom = 1;
|
||||||
m_use_rgb = false;
|
m_use_rgb = false;
|
||||||
|
m_frame_count = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -64,6 +64,7 @@ public:
|
|||||||
|
|
||||||
int width() const { return m_width; }
|
int width() const { return m_width; }
|
||||||
int height() const { return m_height; }
|
int height() const { return m_height; }
|
||||||
|
size_t getFrameCount() const { return m_frame_count; }
|
||||||
virtual int type() const { return m_type; }
|
virtual int type() const { return m_type; }
|
||||||
|
|
||||||
ExifEntry_t getExifTag(const ExifTagName tag) const;
|
ExifEntry_t getExifTag(const ExifTagName tag) const;
|
||||||
@ -93,6 +94,7 @@ protected:
|
|||||||
bool m_buf_supported;
|
bool m_buf_supported;
|
||||||
bool m_use_rgb; // flag of decode image as RGB order instead of BGR.
|
bool m_use_rgb; // flag of decode image as RGB order instead of BGR.
|
||||||
ExifReader m_exif;
|
ExifReader m_exif;
|
||||||
|
size_t m_frame_count;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -279,6 +279,7 @@ bool TiffDecoder::readHeader()
|
|||||||
|
|
||||||
m_width = wdth;
|
m_width = wdth;
|
||||||
m_height = hght;
|
m_height = hght;
|
||||||
|
m_frame_count = TIFFNumberOfDirectories(tif);
|
||||||
if (ncn == 3 && photometric == PHOTOMETRIC_LOGLUV)
|
if (ncn == 3 && photometric == PHOTOMETRIC_LOGLUV)
|
||||||
{
|
{
|
||||||
m_type = CV_32FC3;
|
m_type = CV_32FC3;
|
||||||
|
@ -1263,26 +1263,8 @@ void ImageCollection::Impl::init(String const& filename, int flags) {
|
|||||||
m_decoder->setSource(filename);
|
m_decoder->setSource(filename);
|
||||||
CV_Assert(m_decoder->readHeader());
|
CV_Assert(m_decoder->readHeader());
|
||||||
|
|
||||||
// count the pages of the image collection
|
m_size = m_decoder->getFrameCount();
|
||||||
size_t count = 1;
|
|
||||||
while(m_decoder->nextPage()) count++;
|
|
||||||
|
|
||||||
m_size = count;
|
|
||||||
m_pages.resize(m_size);
|
m_pages.resize(m_size);
|
||||||
// Reinitialize the decoder because we advanced to the last page while counting the pages of the image
|
|
||||||
#ifdef HAVE_GDAL
|
|
||||||
if (m_flags != IMREAD_UNCHANGED && (m_flags & IMREAD_LOAD_GDAL) == IMREAD_LOAD_GDAL) {
|
|
||||||
m_decoder = GdalDecoder().newDecoder();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
#endif
|
|
||||||
m_decoder = findDecoder(m_filename);
|
|
||||||
#ifdef HAVE_GDAL
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
m_decoder->setSource(m_filename);
|
|
||||||
m_decoder->readHeader();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t ImageCollection::Impl::size() const { return m_size; }
|
size_t ImageCollection::Impl::size() const { return m_size; }
|
||||||
|
@ -296,6 +296,7 @@ TEST_P(Imgcodecs_Avif_Animation_WriteReadSuite, encode_decode) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
EXPECT_NO_THROW(cv::imwritemulti(output, anim_original, encoding_params_));
|
EXPECT_NO_THROW(cv::imwritemulti(output, anim_original, encoding_params_));
|
||||||
|
EXPECT_EQ(anim_original.size(), imcount(output));
|
||||||
|
|
||||||
// Read from file.
|
// Read from file.
|
||||||
std::vector<cv::Mat> anim;
|
std::vector<cv::Mat> anim;
|
||||||
|
Loading…
Reference in New Issue
Block a user