mirror of
https://github.com/opencv/opencv.git
synced 2026-07-31 00:03:03 +04:00
Merge pull request #26872 from sturkmen72:ImageEncoders_revisions
Performance tests for image encoders and decoders and code cleanup #26872 ### Pull Request Readiness Checklist See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request - [x] I agree to contribute to the project under Apache 2 License. - [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV - [x] The PR is proposed to the proper branch - [ ] There is a reference to the original bug report and related work - [ ] There is accuracy test, performance test and test data in opencv_extra repository, if applicable Patch to opencv_extra has the same branch name. - [ ] The feature is well documented and sample code can be built with the project CMake
This commit is contained in:
@@ -298,11 +298,6 @@ bool AvifEncoder::isFormatSupported(int depth) const {
|
||||
return (depth == CV_8U || depth == CV_16U);
|
||||
}
|
||||
|
||||
bool AvifEncoder::write(const Mat &img, const std::vector<int> ¶ms) {
|
||||
std::vector<Mat> img_vec(1, img);
|
||||
return writemulti(img_vec, params);
|
||||
}
|
||||
|
||||
bool AvifEncoder::writeanimation(const Animation& animation,
|
||||
const std::vector<int> ¶ms) {
|
||||
int bit_depth = 8;
|
||||
|
||||
@@ -41,7 +41,6 @@ class AvifEncoder CV_FINAL : public BaseImageEncoder {
|
||||
~AvifEncoder() CV_OVERRIDE;
|
||||
|
||||
bool isFormatSupported(int depth) const CV_OVERRIDE;
|
||||
bool write(const Mat& img, const std::vector<int>& params) CV_OVERRIDE;
|
||||
bool writeanimation(const Animation& animation, const std::vector<int>& params) CV_OVERRIDE;
|
||||
|
||||
ImageEncoder newEncoder() const CV_OVERRIDE;
|
||||
|
||||
@@ -140,6 +140,11 @@ bool BaseImageEncoder::setDestination( std::vector<uchar>& buf )
|
||||
return true;
|
||||
}
|
||||
|
||||
bool BaseImageEncoder::write(const Mat &img, const std::vector<int> ¶ms) {
|
||||
std::vector<Mat> img_vec(1, img);
|
||||
return writemulti(img_vec, params);
|
||||
}
|
||||
|
||||
bool BaseImageEncoder::writemulti(const std::vector<Mat>& img_vec, const std::vector<int>& params)
|
||||
{
|
||||
if(img_vec.size() > 1)
|
||||
@@ -157,6 +162,7 @@ bool BaseImageEncoder::writemulti(const std::vector<Mat>& img_vec, const std::ve
|
||||
|
||||
bool BaseImageEncoder::writeanimation(const Animation&, const std::vector<int>& )
|
||||
{
|
||||
CV_LOG_WARNING(NULL, "No Animation encoder for specified file extension");
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -165,7 +171,7 @@ ImageEncoder BaseImageEncoder::newEncoder() const
|
||||
return ImageEncoder();
|
||||
}
|
||||
|
||||
void BaseImageEncoder::throwOnEror() const
|
||||
void BaseImageEncoder::throwOnError() const
|
||||
{
|
||||
if(!m_last_error.empty())
|
||||
{
|
||||
|
||||
@@ -202,12 +202,11 @@ public:
|
||||
|
||||
/**
|
||||
* @brief Encode and write the image data.
|
||||
* This is a pure virtual function that must be implemented by derived classes.
|
||||
* @param img The Mat object containing the image data to be encoded.
|
||||
* @param params A vector of parameters controlling the encoding process (e.g., compression level).
|
||||
* @return true if the image was successfully written, false otherwise.
|
||||
*/
|
||||
virtual bool write(const Mat& img, const std::vector<int>& params) = 0;
|
||||
virtual bool write(const Mat& img, const std::vector<int>& params);
|
||||
|
||||
/**
|
||||
* @brief Encode and write multiple images (e.g., for animated formats).
|
||||
@@ -236,7 +235,7 @@ public:
|
||||
* @brief Throw an exception based on the last error encountered during encoding.
|
||||
* This method can be used to propagate error conditions back to the caller.
|
||||
*/
|
||||
virtual void throwOnEror() const;
|
||||
virtual void throwOnError() const;
|
||||
|
||||
protected:
|
||||
String m_description; ///< Description of the encoder (e.g., format name, capabilities).
|
||||
|
||||
@@ -514,19 +514,11 @@ GifEncoder::~GifEncoder() {
|
||||
close();
|
||||
}
|
||||
|
||||
bool GifEncoder::isFormatSupported(int depth) const {
|
||||
return depth == CV_8U;
|
||||
}
|
||||
|
||||
bool GifEncoder::write(const Mat &img, const std::vector<int> ¶ms) {
|
||||
std::vector<Mat> img_vec(1, img);
|
||||
return writemulti(img_vec, params);
|
||||
}
|
||||
|
||||
bool GifEncoder::writeanimation(const Animation& animation, const std::vector<int>& params) {
|
||||
if (animation.frames.empty()) {
|
||||
return false;
|
||||
}
|
||||
CV_CheckDepthEQ(animation.frames[0].depth(), CV_8U, "GIF encoder supports only 8-bit unsigned images");
|
||||
|
||||
if (m_buf) {
|
||||
if (!strm.open(*m_buf)) {
|
||||
|
||||
@@ -83,9 +83,6 @@ public:
|
||||
GifEncoder();
|
||||
~GifEncoder() CV_OVERRIDE;
|
||||
|
||||
bool isFormatSupported(int depth) const CV_OVERRIDE;
|
||||
|
||||
bool write(const Mat& img, const std::vector<int>& params) CV_OVERRIDE;
|
||||
bool writeanimation(const Animation& animation, const std::vector<int>& params) CV_OVERRIDE;
|
||||
|
||||
ImageEncoder newEncoder() const CV_OVERRIDE;
|
||||
|
||||
@@ -1412,6 +1412,9 @@ void PngEncoder::deflateRectFin(unsigned char* zbuf, uint32_t* zsize, int bpp, i
|
||||
|
||||
bool PngEncoder::writeanimation(const Animation& animation, const std::vector<int>& params)
|
||||
{
|
||||
int frame_type = animation.frames[0].type();
|
||||
int frame_depth = animation.frames[0].depth();
|
||||
CV_CheckType(frame_type, frame_depth == CV_8U || frame_depth == CV_16U, "APNG decoder supports only 8 or 16 bit unsigned images");
|
||||
int compression_level = 6;
|
||||
int compression_strategy = IMWRITE_PNG_STRATEGY_RLE; // Default strategy
|
||||
bool isBilevel = false;
|
||||
@@ -1435,7 +1438,8 @@ bool PngEncoder::writeanimation(const Animation& animation, const std::vector<in
|
||||
}
|
||||
}
|
||||
|
||||
CV_UNUSED(isBilevel);
|
||||
if (isBilevel)
|
||||
CV_LOG_WARNING(NULL, "IMWRITE_PNG_BILEVEL parameter is not supported yet.");
|
||||
uint32_t first =0;
|
||||
uint32_t loops= animation.loop_count;
|
||||
uint32_t coltype= animation.frames[0].channels() == 1 ? PNG_COLOR_TYPE_GRAY : animation.frames[0].channels() == 3 ? PNG_COLOR_TYPE_RGB : PNG_COLOR_TYPE_RGB_ALPHA;
|
||||
|
||||
@@ -1372,7 +1372,7 @@ bool imencode( const String& ext, InputArray _img,
|
||||
else
|
||||
code = encoder->writemulti(write_vec, params);
|
||||
|
||||
encoder->throwOnEror();
|
||||
encoder->throwOnError();
|
||||
CV_Assert( code );
|
||||
}
|
||||
catch (const cv::Exception& e)
|
||||
|
||||
Reference in New Issue
Block a user