// Tencent is pleased to support the open source community by making ncnn available. // // Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved. // // Licensed under the BSD 3-Clause License (the "License"); you may not use this file except // in compliance with the License. You may obtain a copy of the License at // // https://opensource.org/licenses/BSD-3-Clause // // Unless required by applicable law or agreed to in writing, software distributed // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR // CONDITIONS OF ANY KIND, either express or implied. See the License for the // specific language governing permissions and limitations under the License. #ifndef IMREADWRITE_H #define IMREADWRITE_H #include #include #include "allocator.h" #include "mat.h" #ifndef NCNN_XADD using ncnn::NCNN_XADD; #endif typedef unsigned char uchar; enum { CV_LOAD_IMAGE_UNCHANGED = -1, CV_LOAD_IMAGE_GRAYSCALE = 0, CV_LOAD_IMAGE_COLOR = 1, }; enum { CV_IMWRITE_JPEG_QUALITY = 1 }; // minimal opencv style data structure implementation namespace cv { #define CV_8UC1 1 #define CV_8UC3 3 #define CV_8UC4 4 #define CV_32FC1 4 struct Mat { Mat() : data(0), refcount(0), rows(0), cols(0), c(0) { } Mat(int _rows, int _cols, int flags) : data(0), refcount(0) { create(_rows, _cols, flags); } // copy Mat(const Mat& m) : data(m.data), refcount(m.refcount) { if (refcount) NCNN_XADD(refcount, 1); rows = m.rows; cols = m.cols; c = m.c; } Mat(int _rows, int _cols, int flags, void* _data) : data((unsigned char*)_data), refcount(0) { rows = _rows; cols = _cols; c = flags; } ~Mat() { release(); } // assign Mat& operator=(const Mat& m) { if (this == &m) return *this; if (m.refcount) NCNN_XADD(m.refcount, 1); release(); data = m.data; refcount = m.refcount; rows = m.rows; cols = m.cols; c = m.c; return *this; } void create(int _rows, int _cols, int flags) { release(); rows = _rows; cols = _cols; c = flags; if (total() > 0) { // refcount address must be aligned, so we expand totalsize here size_t totalsize = (total() + 3) >> 2 << 2; data = (uchar*)ncnn::fastMalloc(totalsize + (int)sizeof(*refcount)); refcount = (int*)(((uchar*)data) + totalsize); *refcount = 1; } } void release() { if (refcount && NCNN_XADD(refcount, -1) == 1) ncnn::fastFree(data); data = 0; rows = 0; cols = 0; c = 0; refcount = 0; } Mat clone() const { if (empty()) return Mat(); Mat m(rows, cols, c); if (total() > 0) { memcpy(m.data, data, total()); } return m; } bool empty() const { return data == 0 || total() == 0; } int type() const { return c; } size_t total() const { return cols * rows * c; } uchar* data; // pointer to the reference counter; // when points to user-allocated data, the pointer is NULL int* refcount; int rows; int cols; int c; }; enum ImreadModes { IMREAD_UNCHANGED = -1, IMREAD_GRAYSCALE = 0, IMREAD_COLOR = 1 }; Mat imread(const std::string& path, int flags = IMREAD_COLOR); enum ImwriteFlags { IMWRITE_JPEG_QUALITY = 1 }; bool imwrite(const std::string& path, const Mat& m, const std::vector& params = std::vector()); } // namespace cv #endif // IMREADWRITE_H