|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef IMREADWRITE_H |
|
#define IMREADWRITE_H |
|
|
|
#include <limits.h> |
|
#include <string.h> |
|
#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 |
|
}; |
|
|
|
|
|
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); |
|
} |
|
|
|
|
|
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(); |
|
} |
|
|
|
|
|
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) |
|
{ |
|
|
|
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 (size_t)cols * rows * c; |
|
} |
|
|
|
uchar* data; |
|
|
|
|
|
|
|
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<int>& params = std::vector<int>()); |
|
|
|
} |
|
|
|
#endif |
|
|