mirror of
https://github.com/opencv/opencv.git
synced 2024-12-14 17:29:17 +08:00
8d78400052
Jpeg2000 OpenJPEG port * OpenJPEG based JPEG2000 decoder implementation Currently, the following input color spaces and depth conversions are supported: - 8 bit -> 8 bit - 16 bit -> 16 bit (IMREAD_UNCHANGED, IMREAD_ANYDEPTH) - RGB(a) -> BGR - RGBA -> BGRA (IMREAD_UNCHANGED) - Y(a) -> Y(a) (IMREAD_ANYCOLOR, IMREAD_GRAY, IMREAD_UNCHANGED)) - YCC -> Y (IMREAD_GRAY) * Check for OpenJPEG availability This enables OpenJPEG based JPEG2000 imread support by default, which can be disabled by -DWITH_OPENJPEG=OFF. In case OpenJPEG is enabled and found, any checks for Jasper are skipped. * Implement precision downscaling for precision > 8 without IMREAD_UNCHANGED With IMREAD_UNCHANGED, values are kept from the input image, without it components are downscaled to CV_8U range. * Enable Jpeg2K tests when OpenJPEG is available * Add support for some more color conversions Support IMREAD_GRAY when input color space is RGB or unspecified. Support YUV input color space for BGR output. * fix: problems with unmanaged memory * fix: CMake warning - HAVE_OPENJPEG is undefined Removed trailing whitespaces * fix: CMake find_package OpenJPEG add minimal version * Basic JPEG2K encoder Images with depth CV_8U and CV_16U are supported, with 1 to 4 channels. * feature: Improved code for OpenJPEG2000 encoder/decoder - Removed code duplication - Added error handlers - Extracted functions * feature: Update conversion openjpeg array from/to Mat * feature: Extend ChannelsIterator to fulfill RandomAccessIterator named requirements - Removed channels split in copyFromMatImpl. With ChannelsIterator no allocations are performed. - Split whole loop into 2 parts in copyToMat -> where std::copy and std::transforms are called. * fix: Applied review comments. - Changed `nullptr` in CV_LOG* functions to `NULL` - Added `falls through` comment in decoder color space `switch` - Added warning about unsupported parameters for the encoder * feature: Added decode from in-memory buffers. Co-authored-by: Vadim Levin <vadim.levin@xperience.ai>
100 lines
2.2 KiB
C++
100 lines
2.2 KiB
C++
// This file is part of OpenCV project.
|
|
// It is subject to the license terms in the LICENSE file found in the top-level directory
|
|
// of this distribution and at http://opencv.org/license.html.
|
|
//
|
|
// Copyright (C) 2020, Stefan Brüns <stefan.bruens@rwth-aachen.de>
|
|
|
|
#ifndef _GRFMT_OPENJPEG_H_
|
|
#define _GRFMT_OPENJPEG_H_
|
|
|
|
#ifdef HAVE_OPENJPEG
|
|
|
|
#include "grfmt_base.hpp"
|
|
#include <openjpeg.h>
|
|
|
|
namespace cv {
|
|
namespace detail {
|
|
struct OpjStreamDeleter
|
|
{
|
|
void operator()(opj_stream_t* stream) const
|
|
{
|
|
opj_stream_destroy(stream);
|
|
}
|
|
};
|
|
|
|
struct OpjCodecDeleter
|
|
{
|
|
void operator()(opj_codec_t* codec) const
|
|
{
|
|
opj_destroy_codec(codec);
|
|
}
|
|
};
|
|
|
|
struct OpjImageDeleter
|
|
{
|
|
void operator()(opj_image_t* image) const
|
|
{
|
|
opj_image_destroy(image);
|
|
}
|
|
};
|
|
|
|
struct OpjMemoryBuffer {
|
|
OPJ_BYTE* pos{nullptr};
|
|
OPJ_BYTE* begin{nullptr};
|
|
OPJ_SIZE_T length{0};
|
|
|
|
OpjMemoryBuffer() = default;
|
|
|
|
explicit OpjMemoryBuffer(cv::Mat& mat)
|
|
: pos{ mat.ptr() }, begin{ mat.ptr() }, length{ mat.rows * mat.cols * mat.elemSize() }
|
|
{
|
|
}
|
|
|
|
OPJ_SIZE_T availableBytes() const CV_NOEXCEPT {
|
|
return begin + length - pos;
|
|
}
|
|
};
|
|
|
|
using StreamPtr = std::unique_ptr<opj_stream_t, detail::OpjStreamDeleter>;
|
|
using CodecPtr = std::unique_ptr<opj_codec_t, detail::OpjCodecDeleter>;
|
|
using ImagePtr = std::unique_ptr<opj_image_t, detail::OpjImageDeleter>;
|
|
|
|
} // namespace detail
|
|
|
|
class Jpeg2KOpjDecoder CV_FINAL : public BaseImageDecoder
|
|
{
|
|
public:
|
|
Jpeg2KOpjDecoder();
|
|
~Jpeg2KOpjDecoder() CV_OVERRIDE = default;
|
|
|
|
ImageDecoder newDecoder() const CV_OVERRIDE;
|
|
bool readData( Mat& img ) CV_OVERRIDE;
|
|
bool readHeader() CV_OVERRIDE;
|
|
|
|
private:
|
|
detail::StreamPtr stream_{nullptr};
|
|
detail::CodecPtr codec_{nullptr};
|
|
detail::ImagePtr image_{nullptr};
|
|
|
|
detail::OpjMemoryBuffer opjBuf_;
|
|
|
|
OPJ_UINT32 m_maxPrec = 0;
|
|
};
|
|
|
|
class Jpeg2KOpjEncoder CV_FINAL : public BaseImageEncoder
|
|
{
|
|
public:
|
|
Jpeg2KOpjEncoder();
|
|
~Jpeg2KOpjEncoder() CV_OVERRIDE = default;
|
|
|
|
bool isFormatSupported( int depth ) const CV_OVERRIDE;
|
|
bool write( const Mat& img, const std::vector<int>& params ) CV_OVERRIDE;
|
|
ImageEncoder newEncoder() const CV_OVERRIDE;
|
|
};
|
|
|
|
} //namespace cv
|
|
|
|
#endif
|
|
|
|
#endif/*_GRFMT_OPENJPEG_H_*/
|