Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Opencv
提交
aac7c546
O
Opencv
项目概览
Greenplum
/
Opencv
11 个月 前同步成功
通知
7
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
Opencv
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
aac7c546
编写于
10月 21, 2020
作者:
A
Alexander Alekhin
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
core: move inline code from mat.inl.hpp
上级
7f3d8de2
变更
4
显示空白变更内容
内联
并排
Showing
4 changed file
with
513 addition
and
563 deletion
+513
-563
modules/core/include/opencv2/core/mat.inl.hpp
modules/core/include/opencv2/core/mat.inl.hpp
+0
-562
modules/core/src/matrix.cpp
modules/core/src/matrix.cpp
+279
-1
modules/core/src/matrix_sparse.cpp
modules/core/src/matrix_sparse.cpp
+88
-0
modules/core/src/umatrix.cpp
modules/core/src/umatrix.cpp
+146
-0
未找到文件。
modules/core/include/opencv2/core/mat.inl.hpp
浏览文件 @
aac7c546
...
...
@@ -489,158 +489,6 @@ CV__DEBUG_NS_END
//////////////////////////////////////////// Mat //////////////////////////////////////////
inline
Mat
::
Mat
()
:
flags
(
MAGIC_VAL
),
dims
(
0
),
rows
(
0
),
cols
(
0
),
data
(
0
),
datastart
(
0
),
dataend
(
0
),
datalimit
(
0
),
allocator
(
0
),
u
(
0
),
size
(
&
rows
),
step
(
0
)
{}
inline
Mat
::
Mat
(
int
_rows
,
int
_cols
,
int
_type
)
:
flags
(
MAGIC_VAL
),
dims
(
0
),
rows
(
0
),
cols
(
0
),
data
(
0
),
datastart
(
0
),
dataend
(
0
),
datalimit
(
0
),
allocator
(
0
),
u
(
0
),
size
(
&
rows
),
step
(
0
)
{
create
(
_rows
,
_cols
,
_type
);
}
inline
Mat
::
Mat
(
int
_rows
,
int
_cols
,
int
_type
,
const
Scalar
&
_s
)
:
flags
(
MAGIC_VAL
),
dims
(
0
),
rows
(
0
),
cols
(
0
),
data
(
0
),
datastart
(
0
),
dataend
(
0
),
datalimit
(
0
),
allocator
(
0
),
u
(
0
),
size
(
&
rows
),
step
(
0
)
{
create
(
_rows
,
_cols
,
_type
);
*
this
=
_s
;
}
inline
Mat
::
Mat
(
Size
_sz
,
int
_type
)
:
flags
(
MAGIC_VAL
),
dims
(
0
),
rows
(
0
),
cols
(
0
),
data
(
0
),
datastart
(
0
),
dataend
(
0
),
datalimit
(
0
),
allocator
(
0
),
u
(
0
),
size
(
&
rows
),
step
(
0
)
{
create
(
_sz
.
height
,
_sz
.
width
,
_type
);
}
inline
Mat
::
Mat
(
Size
_sz
,
int
_type
,
const
Scalar
&
_s
)
:
flags
(
MAGIC_VAL
),
dims
(
0
),
rows
(
0
),
cols
(
0
),
data
(
0
),
datastart
(
0
),
dataend
(
0
),
datalimit
(
0
),
allocator
(
0
),
u
(
0
),
size
(
&
rows
),
step
(
0
)
{
create
(
_sz
.
height
,
_sz
.
width
,
_type
);
*
this
=
_s
;
}
inline
Mat
::
Mat
(
int
_dims
,
const
int
*
_sz
,
int
_type
)
:
flags
(
MAGIC_VAL
),
dims
(
0
),
rows
(
0
),
cols
(
0
),
data
(
0
),
datastart
(
0
),
dataend
(
0
),
datalimit
(
0
),
allocator
(
0
),
u
(
0
),
size
(
&
rows
),
step
(
0
)
{
create
(
_dims
,
_sz
,
_type
);
}
inline
Mat
::
Mat
(
int
_dims
,
const
int
*
_sz
,
int
_type
,
const
Scalar
&
_s
)
:
flags
(
MAGIC_VAL
),
dims
(
0
),
rows
(
0
),
cols
(
0
),
data
(
0
),
datastart
(
0
),
dataend
(
0
),
datalimit
(
0
),
allocator
(
0
),
u
(
0
),
size
(
&
rows
),
step
(
0
)
{
create
(
_dims
,
_sz
,
_type
);
*
this
=
_s
;
}
inline
Mat
::
Mat
(
const
std
::
vector
<
int
>&
_sz
,
int
_type
)
:
flags
(
MAGIC_VAL
),
dims
(
0
),
rows
(
0
),
cols
(
0
),
data
(
0
),
datastart
(
0
),
dataend
(
0
),
datalimit
(
0
),
allocator
(
0
),
u
(
0
),
size
(
&
rows
),
step
(
0
)
{
create
(
_sz
,
_type
);
}
inline
Mat
::
Mat
(
const
std
::
vector
<
int
>&
_sz
,
int
_type
,
const
Scalar
&
_s
)
:
flags
(
MAGIC_VAL
),
dims
(
0
),
rows
(
0
),
cols
(
0
),
data
(
0
),
datastart
(
0
),
dataend
(
0
),
datalimit
(
0
),
allocator
(
0
),
u
(
0
),
size
(
&
rows
),
step
(
0
)
{
create
(
_sz
,
_type
);
*
this
=
_s
;
}
inline
Mat
::
Mat
(
const
Mat
&
m
)
:
flags
(
m
.
flags
),
dims
(
m
.
dims
),
rows
(
m
.
rows
),
cols
(
m
.
cols
),
data
(
m
.
data
),
datastart
(
m
.
datastart
),
dataend
(
m
.
dataend
),
datalimit
(
m
.
datalimit
),
allocator
(
m
.
allocator
),
u
(
m
.
u
),
size
(
&
rows
),
step
(
0
)
{
if
(
u
)
CV_XADD
(
&
u
->
refcount
,
1
);
if
(
m
.
dims
<=
2
)
{
step
[
0
]
=
m
.
step
[
0
];
step
[
1
]
=
m
.
step
[
1
];
}
else
{
dims
=
0
;
copySize
(
m
);
}
}
inline
Mat
::
Mat
(
int
_rows
,
int
_cols
,
int
_type
,
void
*
_data
,
size_t
_step
)
:
flags
(
MAGIC_VAL
+
(
_type
&
TYPE_MASK
)),
dims
(
2
),
rows
(
_rows
),
cols
(
_cols
),
data
((
uchar
*
)
_data
),
datastart
((
uchar
*
)
_data
),
dataend
(
0
),
datalimit
(
0
),
allocator
(
0
),
u
(
0
),
size
(
&
rows
)
{
CV_Assert
(
total
()
==
0
||
data
!=
NULL
);
size_t
esz
=
CV_ELEM_SIZE
(
_type
),
esz1
=
CV_ELEM_SIZE1
(
_type
);
size_t
minstep
=
cols
*
esz
;
if
(
_step
==
AUTO_STEP
)
{
_step
=
minstep
;
}
else
{
CV_DbgAssert
(
_step
>=
minstep
);
if
(
_step
%
esz1
!=
0
)
{
CV_Error
(
Error
::
BadStep
,
"Step must be a multiple of esz1"
);
}
}
step
[
0
]
=
_step
;
step
[
1
]
=
esz
;
datalimit
=
datastart
+
_step
*
rows
;
dataend
=
datalimit
-
_step
+
minstep
;
updateContinuityFlag
();
}
inline
Mat
::
Mat
(
Size
_sz
,
int
_type
,
void
*
_data
,
size_t
_step
)
:
flags
(
MAGIC_VAL
+
(
_type
&
TYPE_MASK
)),
dims
(
2
),
rows
(
_sz
.
height
),
cols
(
_sz
.
width
),
data
((
uchar
*
)
_data
),
datastart
((
uchar
*
)
_data
),
dataend
(
0
),
datalimit
(
0
),
allocator
(
0
),
u
(
0
),
size
(
&
rows
)
{
CV_Assert
(
total
()
==
0
||
data
!=
NULL
);
size_t
esz
=
CV_ELEM_SIZE
(
_type
),
esz1
=
CV_ELEM_SIZE1
(
_type
);
size_t
minstep
=
cols
*
esz
;
if
(
_step
==
AUTO_STEP
)
{
_step
=
minstep
;
}
else
{
CV_DbgAssert
(
_step
>=
minstep
);
if
(
_step
%
esz1
!=
0
)
{
CV_Error
(
Error
::
BadStep
,
"Step must be a multiple of esz1"
);
}
}
step
[
0
]
=
_step
;
step
[
1
]
=
esz
;
datalimit
=
datastart
+
_step
*
rows
;
dataend
=
datalimit
-
_step
+
minstep
;
updateContinuityFlag
();
}
template
<
typename
_Tp
>
inline
Mat
::
Mat
(
const
std
::
vector
<
_Tp
>&
vec
,
bool
copyData
)
:
flags
(
MAGIC_VAL
|
traits
::
Type
<
_Tp
>::
value
|
CV_MAT_CONT_FLAG
),
dims
(
2
),
rows
((
int
)
vec
.
size
()),
...
...
@@ -778,43 +626,6 @@ Mat::Mat(const MatCommaInitializer_<_Tp>& commaInitializer)
*
this
=
commaInitializer
.
operator
Mat_
<
_Tp
>
();
}
inline
Mat
::~
Mat
()
{
release
();
if
(
step
.
p
!=
step
.
buf
)
fastFree
(
step
.
p
);
}
inline
Mat
&
Mat
::
operator
=
(
const
Mat
&
m
)
{
if
(
this
!=
&
m
)
{
if
(
m
.
u
)
CV_XADD
(
&
m
.
u
->
refcount
,
1
);
release
();
flags
=
m
.
flags
;
if
(
dims
<=
2
&&
m
.
dims
<=
2
)
{
dims
=
m
.
dims
;
rows
=
m
.
rows
;
cols
=
m
.
cols
;
step
[
0
]
=
m
.
step
[
0
];
step
[
1
]
=
m
.
step
[
1
];
}
else
copySize
(
m
);
data
=
m
.
data
;
datastart
=
m
.
datastart
;
dataend
=
m
.
dataend
;
datalimit
=
m
.
datalimit
;
allocator
=
m
.
allocator
;
u
=
m
.
u
;
}
return
*
this
;
}
inline
Mat
Mat
::
row
(
int
y
)
const
{
...
...
@@ -851,67 +662,6 @@ Mat Mat::colRange(const Range& r) const
return
Mat
(
*
this
,
Range
::
all
(),
r
);
}
inline
Mat
Mat
::
clone
()
const
{
Mat
m
;
copyTo
(
m
);
return
m
;
}
inline
void
Mat
::
assignTo
(
Mat
&
m
,
int
_type
)
const
{
if
(
_type
<
0
)
m
=
*
this
;
else
convertTo
(
m
,
_type
);
}
inline
void
Mat
::
create
(
int
_rows
,
int
_cols
,
int
_type
)
{
_type
&=
TYPE_MASK
;
if
(
dims
<=
2
&&
rows
==
_rows
&&
cols
==
_cols
&&
type
()
==
_type
&&
data
)
return
;
int
sz
[]
=
{
_rows
,
_cols
};
create
(
2
,
sz
,
_type
);
}
inline
void
Mat
::
create
(
Size
_sz
,
int
_type
)
{
create
(
_sz
.
height
,
_sz
.
width
,
_type
);
}
inline
void
Mat
::
addref
()
{
if
(
u
)
CV_XADD
(
&
u
->
refcount
,
1
);
}
inline
void
Mat
::
release
()
{
if
(
u
&&
CV_XADD
(
&
u
->
refcount
,
-
1
)
==
1
)
deallocate
();
u
=
NULL
;
datastart
=
dataend
=
datalimit
=
data
=
0
;
for
(
int
i
=
0
;
i
<
dims
;
i
++
)
size
.
p
[
i
]
=
0
;
#ifdef _DEBUG
flags
=
MAGIC_VAL
;
dims
=
rows
=
cols
=
0
;
if
(
step
.
p
!=
step
.
buf
)
{
fastFree
(
step
.
p
);
step
.
p
=
step
.
buf
;
size
.
p
=
&
rows
;
}
#endif
}
inline
Mat
Mat
::
operator
()(
Range
_rowRange
,
Range
_colRange
)
const
{
...
...
@@ -980,40 +730,6 @@ int Mat::channels() const
return
CV_MAT_CN
(
flags
);
}
inline
size_t
Mat
::
step1
(
int
i
)
const
{
return
step
.
p
[
i
]
/
elemSize1
();
}
inline
bool
Mat
::
empty
()
const
{
return
data
==
0
||
total
()
==
0
||
dims
==
0
;
}
inline
size_t
Mat
::
total
()
const
{
if
(
dims
<=
2
)
return
(
size_t
)
rows
*
cols
;
size_t
p
=
1
;
for
(
int
i
=
0
;
i
<
dims
;
i
++
)
p
*=
size
[
i
];
return
p
;
}
inline
size_t
Mat
::
total
(
int
startDim
,
int
endDim
)
const
{
CV_Assert
(
0
<=
startDim
&&
startDim
<=
endDim
);
size_t
p
=
1
;
int
endDim_
=
endDim
<=
dims
?
endDim
:
dims
;
for
(
int
i
=
startDim
;
i
<
endDim_
;
i
++
)
p
*=
size
[
i
];
return
p
;
}
inline
uchar
*
Mat
::
ptr
(
int
y
)
{
...
...
@@ -1544,22 +1260,6 @@ MatSize::operator const int*() const
return
p
;
}
inline
bool
MatSize
::
operator
==
(
const
MatSize
&
sz
)
const
{
int
d
=
dims
();
int
dsz
=
sz
.
dims
();
if
(
d
!=
dsz
)
return
false
;
if
(
d
==
2
)
return
p
[
0
]
==
sz
.
p
[
0
]
&&
p
[
1
]
==
sz
.
p
[
1
];
for
(
int
i
=
0
;
i
<
d
;
i
++
)
if
(
p
[
i
]
!=
sz
.
p
[
i
]
)
return
false
;
return
true
;
}
inline
bool
MatSize
::
operator
!=
(
const
MatSize
&
sz
)
const
{
...
...
@@ -1820,9 +1520,7 @@ template<typename _Tp> inline
void
Mat_
<
_Tp
>::
release
()
{
Mat
::
release
();
#ifdef _DEBUG
flags
=
(
flags
&
~
CV_MAT_TYPE_MASK
)
|
traits
::
Type
<
_Tp
>::
value
;
#endif
}
template
<
typename
_Tp
>
inline
...
...
@@ -2182,51 +1880,6 @@ Mat_<_Tp>::Mat_(MatExpr&& e)
///////////////////////////// SparseMat /////////////////////////////
inline
SparseMat
::
SparseMat
()
:
flags
(
MAGIC_VAL
),
hdr
(
0
)
{}
inline
SparseMat
::
SparseMat
(
int
_dims
,
const
int
*
_sizes
,
int
_type
)
:
flags
(
MAGIC_VAL
),
hdr
(
0
)
{
create
(
_dims
,
_sizes
,
_type
);
}
inline
SparseMat
::
SparseMat
(
const
SparseMat
&
m
)
:
flags
(
m
.
flags
),
hdr
(
m
.
hdr
)
{
addref
();
}
inline
SparseMat
::~
SparseMat
()
{
release
();
}
inline
SparseMat
&
SparseMat
::
operator
=
(
const
SparseMat
&
m
)
{
if
(
this
!=
&
m
)
{
if
(
m
.
hdr
)
CV_XADD
(
&
m
.
hdr
->
refcount
,
1
);
release
();
flags
=
m
.
flags
;
hdr
=
m
.
hdr
;
}
return
*
this
;
}
inline
SparseMat
&
SparseMat
::
operator
=
(
const
Mat
&
m
)
{
return
(
*
this
=
SparseMat
(
m
));
}
inline
SparseMat
SparseMat
::
clone
()
const
{
...
...
@@ -2235,30 +1888,6 @@ SparseMat SparseMat::clone() const
return
temp
;
}
inline
void
SparseMat
::
assignTo
(
SparseMat
&
m
,
int
_type
)
const
{
if
(
_type
<
0
)
m
=
*
this
;
else
convertTo
(
m
,
_type
);
}
inline
void
SparseMat
::
addref
()
{
if
(
hdr
)
CV_XADD
(
&
hdr
->
refcount
,
1
);
}
inline
void
SparseMat
::
release
()
{
if
(
hdr
&&
CV_XADD
(
&
hdr
->
refcount
,
-
1
)
==
1
)
delete
hdr
;
hdr
=
0
;
}
inline
size_t
SparseMat
::
elemSize
()
const
{
...
...
@@ -2318,36 +1947,6 @@ size_t SparseMat::nzcount() const
return
hdr
?
hdr
->
nodeCount
:
0
;
}
inline
size_t
SparseMat
::
hash
(
int
i0
)
const
{
return
(
size_t
)
i0
;
}
inline
size_t
SparseMat
::
hash
(
int
i0
,
int
i1
)
const
{
return
(
size_t
)(
unsigned
)
i0
*
HASH_SCALE
+
(
unsigned
)
i1
;
}
inline
size_t
SparseMat
::
hash
(
int
i0
,
int
i1
,
int
i2
)
const
{
return
((
size_t
)(
unsigned
)
i0
*
HASH_SCALE
+
(
unsigned
)
i1
)
*
HASH_SCALE
+
(
unsigned
)
i2
;
}
inline
size_t
SparseMat
::
hash
(
const
int
*
idx
)
const
{
size_t
h
=
(
unsigned
)
idx
[
0
];
if
(
!
hdr
)
return
0
;
int
d
=
hdr
->
dims
;
for
(
int
i
=
1
;
i
<
d
;
i
++
)
h
=
h
*
HASH_SCALE
+
(
unsigned
)
idx
[
i
];
return
h
;
}
template
<
typename
_Tp
>
inline
_Tp
&
SparseMat
::
ref
(
int
i0
,
size_t
*
hashval
)
{
...
...
@@ -3667,74 +3266,6 @@ const Mat_<_Tp>& operator /= (const Mat_<_Tp>& a, const MatExpr& b)
//////////////////////////////// UMat ////////////////////////////////
inline
UMat
::
UMat
(
UMatUsageFlags
_usageFlags
)
:
flags
(
MAGIC_VAL
),
dims
(
0
),
rows
(
0
),
cols
(
0
),
allocator
(
0
),
usageFlags
(
_usageFlags
),
u
(
0
),
offset
(
0
),
size
(
&
rows
)
{}
inline
UMat
::
UMat
(
int
_rows
,
int
_cols
,
int
_type
,
UMatUsageFlags
_usageFlags
)
:
flags
(
MAGIC_VAL
),
dims
(
0
),
rows
(
0
),
cols
(
0
),
allocator
(
0
),
usageFlags
(
_usageFlags
),
u
(
0
),
offset
(
0
),
size
(
&
rows
)
{
create
(
_rows
,
_cols
,
_type
);
}
inline
UMat
::
UMat
(
int
_rows
,
int
_cols
,
int
_type
,
const
Scalar
&
_s
,
UMatUsageFlags
_usageFlags
)
:
flags
(
MAGIC_VAL
),
dims
(
0
),
rows
(
0
),
cols
(
0
),
allocator
(
0
),
usageFlags
(
_usageFlags
),
u
(
0
),
offset
(
0
),
size
(
&
rows
)
{
create
(
_rows
,
_cols
,
_type
);
*
this
=
_s
;
}
inline
UMat
::
UMat
(
Size
_sz
,
int
_type
,
UMatUsageFlags
_usageFlags
)
:
flags
(
MAGIC_VAL
),
dims
(
0
),
rows
(
0
),
cols
(
0
),
allocator
(
0
),
usageFlags
(
_usageFlags
),
u
(
0
),
offset
(
0
),
size
(
&
rows
)
{
create
(
_sz
.
height
,
_sz
.
width
,
_type
);
}
inline
UMat
::
UMat
(
Size
_sz
,
int
_type
,
const
Scalar
&
_s
,
UMatUsageFlags
_usageFlags
)
:
flags
(
MAGIC_VAL
),
dims
(
0
),
rows
(
0
),
cols
(
0
),
allocator
(
0
),
usageFlags
(
_usageFlags
),
u
(
0
),
offset
(
0
),
size
(
&
rows
)
{
create
(
_sz
.
height
,
_sz
.
width
,
_type
);
*
this
=
_s
;
}
inline
UMat
::
UMat
(
int
_dims
,
const
int
*
_sz
,
int
_type
,
UMatUsageFlags
_usageFlags
)
:
flags
(
MAGIC_VAL
),
dims
(
0
),
rows
(
0
),
cols
(
0
),
allocator
(
0
),
usageFlags
(
_usageFlags
),
u
(
0
),
offset
(
0
),
size
(
&
rows
)
{
create
(
_dims
,
_sz
,
_type
);
}
inline
UMat
::
UMat
(
int
_dims
,
const
int
*
_sz
,
int
_type
,
const
Scalar
&
_s
,
UMatUsageFlags
_usageFlags
)
:
flags
(
MAGIC_VAL
),
dims
(
0
),
rows
(
0
),
cols
(
0
),
allocator
(
0
),
usageFlags
(
_usageFlags
),
u
(
0
),
offset
(
0
),
size
(
&
rows
)
{
create
(
_dims
,
_sz
,
_type
);
*
this
=
_s
;
}
inline
UMat
::
UMat
(
const
UMat
&
m
)
:
flags
(
m
.
flags
),
dims
(
m
.
dims
),
rows
(
m
.
rows
),
cols
(
m
.
cols
),
allocator
(
m
.
allocator
),
usageFlags
(
m
.
usageFlags
),
u
(
m
.
u
),
offset
(
m
.
offset
),
size
(
&
rows
)
{
addref
();
if
(
m
.
dims
<=
2
)
{
step
[
0
]
=
m
.
step
[
0
];
step
[
1
]
=
m
.
step
[
1
];
}
else
{
dims
=
0
;
copySize
(
m
);
}
}
template
<
typename
_Tp
>
inline
UMat
::
UMat
(
const
std
::
vector
<
_Tp
>&
vec
,
bool
copyData
)
:
flags
(
MAGIC_VAL
|
traits
::
Type
<
_Tp
>::
value
|
CV_MAT_CONT_FLAG
),
dims
(
2
),
rows
((
int
)
vec
.
size
()),
...
...
@@ -3751,33 +3282,6 @@ cols(1), allocator(0), usageFlags(USAGE_DEFAULT), u(0), offset(0), size(&rows)
Mat
((
int
)
vec
.
size
(),
1
,
traits
::
Type
<
_Tp
>::
value
,
(
uchar
*
)
&
vec
[
0
]).
copyTo
(
*
this
);
}
inline
UMat
&
UMat
::
operator
=
(
const
UMat
&
m
)
{
if
(
this
!=
&
m
)
{
const_cast
<
UMat
&>
(
m
).
addref
();
release
();
flags
=
m
.
flags
;
if
(
dims
<=
2
&&
m
.
dims
<=
2
)
{
dims
=
m
.
dims
;
rows
=
m
.
rows
;
cols
=
m
.
cols
;
step
[
0
]
=
m
.
step
[
0
];
step
[
1
]
=
m
.
step
[
1
];
}
else
copySize
(
m
);
allocator
=
m
.
allocator
;
if
(
usageFlags
==
USAGE_DEFAULT
)
usageFlags
=
m
.
usageFlags
;
u
=
m
.
u
;
offset
=
m
.
offset
;
}
return
*
this
;
}
inline
UMat
UMat
::
row
(
int
y
)
const
{
...
...
@@ -3814,55 +3318,6 @@ UMat UMat::colRange(const Range& r) const
return
UMat
(
*
this
,
Range
::
all
(),
r
);
}
inline
UMat
UMat
::
clone
()
const
{
UMat
m
;
copyTo
(
m
);
return
m
;
}
inline
void
UMat
::
assignTo
(
UMat
&
m
,
int
_type
)
const
{
if
(
_type
<
0
)
m
=
*
this
;
else
convertTo
(
m
,
_type
);
}
inline
void
UMat
::
create
(
int
_rows
,
int
_cols
,
int
_type
,
UMatUsageFlags
_usageFlags
)
{
_type
&=
TYPE_MASK
;
if
(
dims
<=
2
&&
rows
==
_rows
&&
cols
==
_cols
&&
type
()
==
_type
&&
u
)
return
;
int
sz
[]
=
{
_rows
,
_cols
};
create
(
2
,
sz
,
_type
,
_usageFlags
);
}
inline
void
UMat
::
create
(
Size
_sz
,
int
_type
,
UMatUsageFlags
_usageFlags
)
{
create
(
_sz
.
height
,
_sz
.
width
,
_type
,
_usageFlags
);
}
inline
void
UMat
::
addref
()
{
if
(
u
)
CV_XADD
(
&
(
u
->
urefcount
),
1
);
}
inline
void
UMat
::
release
()
{
if
(
u
&&
CV_XADD
(
&
(
u
->
urefcount
),
-
1
)
==
1
)
deallocate
();
for
(
int
i
=
0
;
i
<
dims
;
i
++
)
size
.
p
[
i
]
=
0
;
u
=
0
;
}
inline
UMat
UMat
::
operator
()(
Range
_rowRange
,
Range
_colRange
)
const
{
...
...
@@ -3937,23 +3392,6 @@ size_t UMat::step1(int i) const
return
step
.
p
[
i
]
/
elemSize1
();
}
inline
bool
UMat
::
empty
()
const
{
return
u
==
0
||
total
()
==
0
||
dims
==
0
;
}
inline
size_t
UMat
::
total
()
const
{
if
(
dims
<=
2
)
return
(
size_t
)
rows
*
cols
;
size_t
p
=
1
;
for
(
int
i
=
0
;
i
<
dims
;
i
++
)
p
*=
size
[
i
];
return
p
;
}
#ifdef CV_CXX_MOVE_SEMANTICS
inline
...
...
modules/core/src/matrix.cpp
浏览文件 @
aac7c546
...
...
@@ -204,6 +204,21 @@ MatAllocator* Mat::getStdAllocator()
//==================================================================================================
bool
MatSize
::
operator
==
(
const
MatSize
&
sz
)
const
{
int
d
=
dims
();
int
dsz
=
sz
.
dims
();
if
(
d
!=
dsz
)
return
false
;
if
(
d
==
2
)
return
p
[
0
]
==
sz
.
p
[
0
]
&&
p
[
1
]
==
sz
.
p
[
1
];
for
(
int
i
=
0
;
i
<
d
;
i
++
)
if
(
p
[
i
]
!=
sz
.
p
[
i
]
)
return
false
;
return
true
;
}
void
setSize
(
Mat
&
m
,
int
_dims
,
const
int
*
_sz
,
const
size_t
*
_steps
,
bool
autoSteps
)
{
CV_Assert
(
0
<=
_dims
&&
_dims
<=
CV_MAX_DIM
);
...
...
@@ -320,7 +335,270 @@ void finalizeHdr(Mat& m)
m
.
dataend
=
m
.
datalimit
=
0
;
}
//==================================================================================================
//======================================= Mat ======================================================
Mat
::
Mat
()
:
flags
(
MAGIC_VAL
),
dims
(
0
),
rows
(
0
),
cols
(
0
),
data
(
0
),
datastart
(
0
),
dataend
(
0
),
datalimit
(
0
),
allocator
(
0
),
u
(
0
),
size
(
&
rows
),
step
(
0
)
{}
Mat
::
Mat
(
int
_rows
,
int
_cols
,
int
_type
)
:
flags
(
MAGIC_VAL
),
dims
(
0
),
rows
(
0
),
cols
(
0
),
data
(
0
),
datastart
(
0
),
dataend
(
0
),
datalimit
(
0
),
allocator
(
0
),
u
(
0
),
size
(
&
rows
),
step
(
0
)
{
create
(
_rows
,
_cols
,
_type
);
}
Mat
::
Mat
(
int
_rows
,
int
_cols
,
int
_type
,
const
Scalar
&
_s
)
:
flags
(
MAGIC_VAL
),
dims
(
0
),
rows
(
0
),
cols
(
0
),
data
(
0
),
datastart
(
0
),
dataend
(
0
),
datalimit
(
0
),
allocator
(
0
),
u
(
0
),
size
(
&
rows
),
step
(
0
)
{
create
(
_rows
,
_cols
,
_type
);
*
this
=
_s
;
}
Mat
::
Mat
(
Size
_sz
,
int
_type
)
:
flags
(
MAGIC_VAL
),
dims
(
0
),
rows
(
0
),
cols
(
0
),
data
(
0
),
datastart
(
0
),
dataend
(
0
),
datalimit
(
0
),
allocator
(
0
),
u
(
0
),
size
(
&
rows
),
step
(
0
)
{
create
(
_sz
.
height
,
_sz
.
width
,
_type
);
}
Mat
::
Mat
(
Size
_sz
,
int
_type
,
const
Scalar
&
_s
)
:
flags
(
MAGIC_VAL
),
dims
(
0
),
rows
(
0
),
cols
(
0
),
data
(
0
),
datastart
(
0
),
dataend
(
0
),
datalimit
(
0
),
allocator
(
0
),
u
(
0
),
size
(
&
rows
),
step
(
0
)
{
create
(
_sz
.
height
,
_sz
.
width
,
_type
);
*
this
=
_s
;
}
Mat
::
Mat
(
int
_dims
,
const
int
*
_sz
,
int
_type
)
:
flags
(
MAGIC_VAL
),
dims
(
0
),
rows
(
0
),
cols
(
0
),
data
(
0
),
datastart
(
0
),
dataend
(
0
),
datalimit
(
0
),
allocator
(
0
),
u
(
0
),
size
(
&
rows
),
step
(
0
)
{
create
(
_dims
,
_sz
,
_type
);
}
Mat
::
Mat
(
int
_dims
,
const
int
*
_sz
,
int
_type
,
const
Scalar
&
_s
)
:
flags
(
MAGIC_VAL
),
dims
(
0
),
rows
(
0
),
cols
(
0
),
data
(
0
),
datastart
(
0
),
dataend
(
0
),
datalimit
(
0
),
allocator
(
0
),
u
(
0
),
size
(
&
rows
),
step
(
0
)
{
create
(
_dims
,
_sz
,
_type
);
*
this
=
_s
;
}
Mat
::
Mat
(
const
std
::
vector
<
int
>&
_sz
,
int
_type
)
:
flags
(
MAGIC_VAL
),
dims
(
0
),
rows
(
0
),
cols
(
0
),
data
(
0
),
datastart
(
0
),
dataend
(
0
),
datalimit
(
0
),
allocator
(
0
),
u
(
0
),
size
(
&
rows
),
step
(
0
)
{
create
(
_sz
,
_type
);
}
Mat
::
Mat
(
const
std
::
vector
<
int
>&
_sz
,
int
_type
,
const
Scalar
&
_s
)
:
flags
(
MAGIC_VAL
),
dims
(
0
),
rows
(
0
),
cols
(
0
),
data
(
0
),
datastart
(
0
),
dataend
(
0
),
datalimit
(
0
),
allocator
(
0
),
u
(
0
),
size
(
&
rows
),
step
(
0
)
{
create
(
_sz
,
_type
);
*
this
=
_s
;
}
Mat
::
Mat
(
const
Mat
&
m
)
:
flags
(
m
.
flags
),
dims
(
m
.
dims
),
rows
(
m
.
rows
),
cols
(
m
.
cols
),
data
(
m
.
data
),
datastart
(
m
.
datastart
),
dataend
(
m
.
dataend
),
datalimit
(
m
.
datalimit
),
allocator
(
m
.
allocator
),
u
(
m
.
u
),
size
(
&
rows
),
step
(
0
)
{
if
(
u
)
CV_XADD
(
&
u
->
refcount
,
1
);
if
(
m
.
dims
<=
2
)
{
step
[
0
]
=
m
.
step
[
0
];
step
[
1
]
=
m
.
step
[
1
];
}
else
{
dims
=
0
;
copySize
(
m
);
}
}
Mat
::
Mat
(
int
_rows
,
int
_cols
,
int
_type
,
void
*
_data
,
size_t
_step
)
:
flags
(
MAGIC_VAL
+
(
_type
&
TYPE_MASK
)),
dims
(
2
),
rows
(
_rows
),
cols
(
_cols
),
data
((
uchar
*
)
_data
),
datastart
((
uchar
*
)
_data
),
dataend
(
0
),
datalimit
(
0
),
allocator
(
0
),
u
(
0
),
size
(
&
rows
)
{
CV_Assert
(
total
()
==
0
||
data
!=
NULL
);
size_t
esz
=
CV_ELEM_SIZE
(
_type
),
esz1
=
CV_ELEM_SIZE1
(
_type
);
size_t
minstep
=
cols
*
esz
;
if
(
_step
==
AUTO_STEP
)
{
_step
=
minstep
;
}
else
{
CV_Assert
(
_step
>=
minstep
);
if
(
_step
%
esz1
!=
0
)
{
CV_Error
(
Error
::
BadStep
,
"Step must be a multiple of esz1"
);
}
}
step
[
0
]
=
_step
;
step
[
1
]
=
esz
;
datalimit
=
datastart
+
_step
*
rows
;
dataend
=
datalimit
-
_step
+
minstep
;
updateContinuityFlag
();
}
Mat
::
Mat
(
Size
_sz
,
int
_type
,
void
*
_data
,
size_t
_step
)
:
flags
(
MAGIC_VAL
+
(
_type
&
TYPE_MASK
)),
dims
(
2
),
rows
(
_sz
.
height
),
cols
(
_sz
.
width
),
data
((
uchar
*
)
_data
),
datastart
((
uchar
*
)
_data
),
dataend
(
0
),
datalimit
(
0
),
allocator
(
0
),
u
(
0
),
size
(
&
rows
)
{
CV_Assert
(
total
()
==
0
||
data
!=
NULL
);
size_t
esz
=
CV_ELEM_SIZE
(
_type
),
esz1
=
CV_ELEM_SIZE1
(
_type
);
size_t
minstep
=
cols
*
esz
;
if
(
_step
==
AUTO_STEP
)
{
_step
=
minstep
;
}
else
{
CV_Assert
(
_step
>=
minstep
);
if
(
_step
%
esz1
!=
0
)
{
CV_Error
(
Error
::
BadStep
,
"Step must be a multiple of esz1"
);
}
}
step
[
0
]
=
_step
;
step
[
1
]
=
esz
;
datalimit
=
datastart
+
_step
*
rows
;
dataend
=
datalimit
-
_step
+
minstep
;
updateContinuityFlag
();
}
Mat
::~
Mat
()
{
release
();
if
(
step
.
p
!=
step
.
buf
)
fastFree
(
step
.
p
);
}
Mat
&
Mat
::
operator
=
(
const
Mat
&
m
)
{
if
(
this
!=
&
m
)
{
if
(
m
.
u
)
CV_XADD
(
&
m
.
u
->
refcount
,
1
);
release
();
flags
=
m
.
flags
;
if
(
dims
<=
2
&&
m
.
dims
<=
2
)
{
dims
=
m
.
dims
;
rows
=
m
.
rows
;
cols
=
m
.
cols
;
step
[
0
]
=
m
.
step
[
0
];
step
[
1
]
=
m
.
step
[
1
];
}
else
copySize
(
m
);
data
=
m
.
data
;
datastart
=
m
.
datastart
;
dataend
=
m
.
dataend
;
datalimit
=
m
.
datalimit
;
allocator
=
m
.
allocator
;
u
=
m
.
u
;
}
return
*
this
;
}
Mat
Mat
::
clone
()
const
{
Mat
m
;
copyTo
(
m
);
return
m
;
}
void
Mat
::
assignTo
(
Mat
&
m
,
int
_type
)
const
{
if
(
_type
<
0
)
m
=
*
this
;
else
convertTo
(
m
,
_type
);
}
void
Mat
::
create
(
int
_rows
,
int
_cols
,
int
_type
)
{
_type
&=
TYPE_MASK
;
if
(
dims
<=
2
&&
rows
==
_rows
&&
cols
==
_cols
&&
type
()
==
_type
&&
data
)
return
;
int
sz
[]
=
{
_rows
,
_cols
};
create
(
2
,
sz
,
_type
);
}
void
Mat
::
create
(
Size
_sz
,
int
_type
)
{
create
(
_sz
.
height
,
_sz
.
width
,
_type
);
}
void
Mat
::
addref
()
{
if
(
u
)
CV_XADD
(
&
u
->
refcount
,
1
);
}
void
Mat
::
release
()
{
if
(
u
&&
CV_XADD
(
&
u
->
refcount
,
-
1
)
==
1
)
deallocate
();
u
=
NULL
;
datastart
=
dataend
=
datalimit
=
data
=
0
;
for
(
int
i
=
0
;
i
<
dims
;
i
++
)
size
.
p
[
i
]
=
0
;
#ifdef _DEBUG
flags
=
MAGIC_VAL
;
dims
=
rows
=
cols
=
0
;
if
(
step
.
p
!=
step
.
buf
)
{
fastFree
(
step
.
p
);
step
.
p
=
step
.
buf
;
size
.
p
=
&
rows
;
}
#endif
}
size_t
Mat
::
step1
(
int
i
)
const
{
return
step
.
p
[
i
]
/
elemSize1
();
}
bool
Mat
::
empty
()
const
{
return
data
==
0
||
total
()
==
0
||
dims
==
0
;
}
size_t
Mat
::
total
()
const
{
if
(
dims
<=
2
)
return
(
size_t
)
rows
*
cols
;
size_t
p
=
1
;
for
(
int
i
=
0
;
i
<
dims
;
i
++
)
p
*=
size
[
i
];
return
p
;
}
size_t
Mat
::
total
(
int
startDim
,
int
endDim
)
const
{
CV_Assert
(
0
<=
startDim
&&
startDim
<=
endDim
);
size_t
p
=
1
;
int
endDim_
=
endDim
<=
dims
?
endDim
:
dims
;
for
(
int
i
=
startDim
;
i
<
endDim_
;
i
++
)
p
*=
size
[
i
];
return
p
;
}
void
Mat
::
create
(
int
d
,
const
int
*
_sizes
,
int
_type
)
{
...
...
modules/core/src/matrix_sparse.cpp
浏览文件 @
aac7c546
...
...
@@ -176,6 +176,94 @@ void SparseMat::Hdr::clear()
nodeCount
=
freeList
=
0
;
}
///////////////////////////// SparseMat /////////////////////////////
SparseMat
::
SparseMat
()
:
flags
(
MAGIC_VAL
),
hdr
(
0
)
{}
SparseMat
::
SparseMat
(
int
_dims
,
const
int
*
_sizes
,
int
_type
)
:
flags
(
MAGIC_VAL
),
hdr
(
0
)
{
create
(
_dims
,
_sizes
,
_type
);
}
SparseMat
::
SparseMat
(
const
SparseMat
&
m
)
:
flags
(
m
.
flags
),
hdr
(
m
.
hdr
)
{
addref
();
}
SparseMat
::~
SparseMat
()
{
release
();
}
SparseMat
&
SparseMat
::
operator
=
(
const
SparseMat
&
m
)
{
if
(
this
!=
&
m
)
{
if
(
m
.
hdr
)
CV_XADD
(
&
m
.
hdr
->
refcount
,
1
);
release
();
flags
=
m
.
flags
;
hdr
=
m
.
hdr
;
}
return
*
this
;
}
SparseMat
&
SparseMat
::
operator
=
(
const
Mat
&
m
)
{
return
(
*
this
=
SparseMat
(
m
));
}
void
SparseMat
::
assignTo
(
SparseMat
&
m
,
int
_type
)
const
{
if
(
_type
<
0
)
m
=
*
this
;
else
convertTo
(
m
,
_type
);
}
void
SparseMat
::
addref
()
{
if
(
hdr
)
CV_XADD
(
&
hdr
->
refcount
,
1
);
}
void
SparseMat
::
release
()
{
if
(
hdr
&&
CV_XADD
(
&
hdr
->
refcount
,
-
1
)
==
1
)
delete
hdr
;
hdr
=
0
;
}
size_t
SparseMat
::
hash
(
int
i0
)
const
{
return
(
size_t
)
i0
;
}
size_t
SparseMat
::
hash
(
int
i0
,
int
i1
)
const
{
return
(
size_t
)(
unsigned
)
i0
*
HASH_SCALE
+
(
unsigned
)
i1
;
}
size_t
SparseMat
::
hash
(
int
i0
,
int
i1
,
int
i2
)
const
{
return
((
size_t
)(
unsigned
)
i0
*
HASH_SCALE
+
(
unsigned
)
i1
)
*
HASH_SCALE
+
(
unsigned
)
i2
;
}
size_t
SparseMat
::
hash
(
const
int
*
idx
)
const
{
size_t
h
=
(
unsigned
)
idx
[
0
];
if
(
!
hdr
)
return
0
;
int
d
=
hdr
->
dims
;
for
(
int
i
=
1
;
i
<
d
;
i
++
)
h
=
h
*
HASH_SCALE
+
(
unsigned
)
idx
[
i
];
return
h
;
}
SparseMat
::
SparseMat
(
const
Mat
&
m
)
:
flags
(
MAGIC_VAL
),
hdr
(
0
)
...
...
modules/core/src/umatrix.cpp
浏览文件 @
aac7c546
...
...
@@ -228,6 +228,152 @@ UMatDataAutoLock::~UMatDataAutoLock()
getUMatDataAutoLocker
().
release
(
u1
,
u2
);
}
//////////////////////////////// UMat ////////////////////////////////
UMat
::
UMat
(
UMatUsageFlags
_usageFlags
)
:
flags
(
MAGIC_VAL
),
dims
(
0
),
rows
(
0
),
cols
(
0
),
allocator
(
0
),
usageFlags
(
_usageFlags
),
u
(
0
),
offset
(
0
),
size
(
&
rows
)
{}
UMat
::
UMat
(
int
_rows
,
int
_cols
,
int
_type
,
UMatUsageFlags
_usageFlags
)
:
flags
(
MAGIC_VAL
),
dims
(
0
),
rows
(
0
),
cols
(
0
),
allocator
(
0
),
usageFlags
(
_usageFlags
),
u
(
0
),
offset
(
0
),
size
(
&
rows
)
{
create
(
_rows
,
_cols
,
_type
);
}
UMat
::
UMat
(
int
_rows
,
int
_cols
,
int
_type
,
const
Scalar
&
_s
,
UMatUsageFlags
_usageFlags
)
:
flags
(
MAGIC_VAL
),
dims
(
0
),
rows
(
0
),
cols
(
0
),
allocator
(
0
),
usageFlags
(
_usageFlags
),
u
(
0
),
offset
(
0
),
size
(
&
rows
)
{
create
(
_rows
,
_cols
,
_type
);
*
this
=
_s
;
}
UMat
::
UMat
(
Size
_sz
,
int
_type
,
UMatUsageFlags
_usageFlags
)
:
flags
(
MAGIC_VAL
),
dims
(
0
),
rows
(
0
),
cols
(
0
),
allocator
(
0
),
usageFlags
(
_usageFlags
),
u
(
0
),
offset
(
0
),
size
(
&
rows
)
{
create
(
_sz
.
height
,
_sz
.
width
,
_type
);
}
UMat
::
UMat
(
Size
_sz
,
int
_type
,
const
Scalar
&
_s
,
UMatUsageFlags
_usageFlags
)
:
flags
(
MAGIC_VAL
),
dims
(
0
),
rows
(
0
),
cols
(
0
),
allocator
(
0
),
usageFlags
(
_usageFlags
),
u
(
0
),
offset
(
0
),
size
(
&
rows
)
{
create
(
_sz
.
height
,
_sz
.
width
,
_type
);
*
this
=
_s
;
}
UMat
::
UMat
(
int
_dims
,
const
int
*
_sz
,
int
_type
,
UMatUsageFlags
_usageFlags
)
:
flags
(
MAGIC_VAL
),
dims
(
0
),
rows
(
0
),
cols
(
0
),
allocator
(
0
),
usageFlags
(
_usageFlags
),
u
(
0
),
offset
(
0
),
size
(
&
rows
)
{
create
(
_dims
,
_sz
,
_type
);
}
UMat
::
UMat
(
int
_dims
,
const
int
*
_sz
,
int
_type
,
const
Scalar
&
_s
,
UMatUsageFlags
_usageFlags
)
:
flags
(
MAGIC_VAL
),
dims
(
0
),
rows
(
0
),
cols
(
0
),
allocator
(
0
),
usageFlags
(
_usageFlags
),
u
(
0
),
offset
(
0
),
size
(
&
rows
)
{
create
(
_dims
,
_sz
,
_type
);
*
this
=
_s
;
}
UMat
::
UMat
(
const
UMat
&
m
)
:
flags
(
m
.
flags
),
dims
(
m
.
dims
),
rows
(
m
.
rows
),
cols
(
m
.
cols
),
allocator
(
m
.
allocator
),
usageFlags
(
m
.
usageFlags
),
u
(
m
.
u
),
offset
(
m
.
offset
),
size
(
&
rows
)
{
addref
();
if
(
m
.
dims
<=
2
)
{
step
[
0
]
=
m
.
step
[
0
];
step
[
1
]
=
m
.
step
[
1
];
}
else
{
dims
=
0
;
copySize
(
m
);
}
}
UMat
&
UMat
::
operator
=
(
const
UMat
&
m
)
{
if
(
this
!=
&
m
)
{
const_cast
<
UMat
&>
(
m
).
addref
();
release
();
flags
=
m
.
flags
;
if
(
dims
<=
2
&&
m
.
dims
<=
2
)
{
dims
=
m
.
dims
;
rows
=
m
.
rows
;
cols
=
m
.
cols
;
step
[
0
]
=
m
.
step
[
0
];
step
[
1
]
=
m
.
step
[
1
];
}
else
copySize
(
m
);
allocator
=
m
.
allocator
;
if
(
usageFlags
==
USAGE_DEFAULT
)
usageFlags
=
m
.
usageFlags
;
u
=
m
.
u
;
offset
=
m
.
offset
;
}
return
*
this
;
}
UMat
UMat
::
clone
()
const
{
UMat
m
;
copyTo
(
m
);
return
m
;
}
void
UMat
::
assignTo
(
UMat
&
m
,
int
_type
)
const
{
if
(
_type
<
0
)
m
=
*
this
;
else
convertTo
(
m
,
_type
);
}
void
UMat
::
create
(
int
_rows
,
int
_cols
,
int
_type
,
UMatUsageFlags
_usageFlags
)
{
_type
&=
TYPE_MASK
;
if
(
dims
<=
2
&&
rows
==
_rows
&&
cols
==
_cols
&&
type
()
==
_type
&&
u
)
return
;
int
sz
[]
=
{
_rows
,
_cols
};
create
(
2
,
sz
,
_type
,
_usageFlags
);
}
void
UMat
::
create
(
Size
_sz
,
int
_type
,
UMatUsageFlags
_usageFlags
)
{
create
(
_sz
.
height
,
_sz
.
width
,
_type
,
_usageFlags
);
}
void
UMat
::
addref
()
{
if
(
u
)
CV_XADD
(
&
(
u
->
urefcount
),
1
);
}
void
UMat
::
release
()
{
if
(
u
&&
CV_XADD
(
&
(
u
->
urefcount
),
-
1
)
==
1
)
deallocate
();
for
(
int
i
=
0
;
i
<
dims
;
i
++
)
size
.
p
[
i
]
=
0
;
u
=
0
;
}
bool
UMat
::
empty
()
const
{
return
u
==
0
||
total
()
==
0
||
dims
==
0
;
}
size_t
UMat
::
total
()
const
{
if
(
dims
<=
2
)
return
(
size_t
)
rows
*
cols
;
size_t
p
=
1
;
for
(
int
i
=
0
;
i
<
dims
;
i
++
)
p
*=
size
[
i
];
return
p
;
}
MatAllocator
*
UMat
::
getStdAllocator
()
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录