Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
O
opencv
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
opencv
Commits
8af83e6d
Commit
8af83e6d
authored
Oct 19, 2010
by
Vadim Pisarevsky
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fixed a few bugs in: Mat::reshape, Mat(CvMat*) constructor, element access, copying nd array etc.
parent
6ed141de
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
76 additions
and
29 deletions
+76
-29
core.hpp
modules/core/include/opencv2/core/core.hpp
+10
-7
mat.hpp
modules/core/include/opencv2/core/mat.hpp
+36
-10
array.cpp
modules/core/src/array.cpp
+5
-1
matrix.cpp
modules/core/src/matrix.cpp
+25
-11
No files found.
modules/core/include/opencv2/core/core.hpp
View file @
8af83e6d
...
@@ -90,7 +90,6 @@ typedef Mat MatND;
...
@@ -90,7 +90,6 @@ typedef Mat MatND;
class
CV_EXPORTS
MatExpr
;
class
CV_EXPORTS
MatExpr
;
class
CV_EXPORTS
MatOp_Base
;
class
CV_EXPORTS
MatOp_Base
;
class
CV_EXPORTS
VectorArg
;
class
CV_EXPORTS
MatArg
;
class
CV_EXPORTS
MatArg
;
class
CV_EXPORTS
MatConstIterator
;
class
CV_EXPORTS
MatConstIterator
;
...
@@ -1257,11 +1256,11 @@ static inline size_t getElemSize(int type) { return CV_ELEM_SIZE(type); }
...
@@ -1257,11 +1256,11 @@ static inline size_t getElemSize(int type) { return CV_ELEM_SIZE(type); }
Custom array allocator
Custom array allocator
*/
*/
class
CV_EXPORTS
Array
Allocator
class
CV_EXPORTS
Mat
Allocator
{
{
public
:
public
:
Array
Allocator
()
{}
Mat
Allocator
()
{}
virtual
~
Array
Allocator
()
{}
virtual
~
Mat
Allocator
()
{}
virtual
void
allocate
(
int
dims
,
const
int
*
sizes
,
int
type
,
int
*&
refcount
,
virtual
void
allocate
(
int
dims
,
const
int
*
sizes
,
int
type
,
int
*&
refcount
,
uchar
*&
datastart
,
uchar
*&
data
,
size_t
*
step
)
=
0
;
uchar
*&
datastart
,
uchar
*&
data
,
size_t
*
step
)
=
0
;
virtual
void
deallocate
(
int
*
refcount
,
uchar
*
datastart
,
uchar
*
data
)
=
0
;
virtual
void
deallocate
(
int
*
refcount
,
uchar
*
datastart
,
uchar
*
data
)
=
0
;
...
@@ -1763,7 +1762,7 @@ public:
...
@@ -1763,7 +1762,7 @@ public:
uchar
*
datalimit
;
uchar
*
datalimit
;
//! custom allocator
//! custom allocator
Array
Allocator
*
allocator
;
Mat
Allocator
*
allocator
;
struct
CV_EXPORTS
MSize
struct
CV_EXPORTS
MSize
{
{
...
@@ -1797,7 +1796,7 @@ public:
...
@@ -1797,7 +1796,7 @@ public:
MStep
step
;
MStep
step
;
};
};
/*!
/*!
Random Number Generator
Random Number Generator
...
@@ -1836,6 +1835,9 @@ public:
...
@@ -1836,6 +1835,9 @@ public:
uint64
state
;
uint64
state
;
};
};
/*!
/*!
Termination criteria in iterative algorithms
Termination criteria in iterative algorithms
...
@@ -2331,7 +2333,8 @@ public:
...
@@ -2331,7 +2333,8 @@ public:
//! converts elliptic arc to a polygonal curve
//! converts elliptic arc to a polygonal curve
CV_EXPORTS
void
ellipse2Poly
(
Point
center
,
Size
axes
,
int
angle
,
CV_EXPORTS
void
ellipse2Poly
(
Point
center
,
Size
axes
,
int
angle
,
int
arcStart
,
int
arcEnd
,
int
delta
,
CV_OUT
vector
<
Point
>&
pts
);
int
arcStart
,
int
arcEnd
,
int
delta
,
CV_OUT
vector
<
Point
>&
pts
);
enum
enum
{
{
...
...
modules/core/include/opencv2/core/mat.hpp
View file @
8af83e6d
...
@@ -172,8 +172,7 @@ inline Mat::Mat(Size _sz, int _type, void* _data, size_t _step)
...
@@ -172,8 +172,7 @@ inline Mat::Mat(Size _sz, int _type, void* _data, size_t _step)
inline
Mat
::
Mat
(
const
CvMat
*
m
,
bool
copyData
)
inline
Mat
::
Mat
(
const
CvMat
*
m
,
bool
copyData
)
:
flags
(
MAGIC_VAL
+
(
m
->
type
&
(
CV_MAT_TYPE_MASK
|
CV_MAT_CONT_FLAG
))),
:
flags
(
MAGIC_VAL
+
(
m
->
type
&
(
CV_MAT_TYPE_MASK
|
CV_MAT_CONT_FLAG
))),
dims
(
2
),
rows
(
m
->
rows
),
cols
(
m
->
cols
),
data
(
m
->
data
.
ptr
),
refcount
(
0
),
dims
(
2
),
rows
(
m
->
rows
),
cols
(
m
->
cols
),
data
(
m
->
data
.
ptr
),
refcount
(
0
),
datastart
(
0
),
dataend
(
0
),
datastart
(
m
->
data
.
ptr
),
allocator
(
0
),
size
(
&
rows
)
allocator
(
0
),
size
(
&
rows
)
{
{
if
(
!
copyData
)
if
(
!
copyData
)
{
{
...
@@ -544,17 +543,41 @@ template<typename _Tp> inline const _Tp& Mat::at(Point pt) const
...
@@ -544,17 +543,41 @@ template<typename _Tp> inline const _Tp& Mat::at(Point pt) const
}
}
template
<
typename
_Tp
>
inline
_Tp
&
Mat
::
at
(
int
i0
)
template
<
typename
_Tp
>
inline
_Tp
&
Mat
::
at
(
int
i0
)
{
return
*
(
_Tp
*
)
ptr
(
i0
);
}
{
CV_DbgAssert
(
dims
<=
2
&&
data
&&
(
size
.
p
[
0
]
==
1
||
size
.
p
[
1
]
==
1
)
&&
(
unsigned
)
i0
<
(
unsigned
)(
size
.
p
[
0
]
+
size
.
p
[
1
]
-
1
)
&&
elemSize
()
==
CV_ELEM_SIZE
(
DataType
<
_Tp
>::
type
)
);
return
*
(
_Tp
*
)(
data
+
step
.
p
[
size
.
p
[
0
]
==
1
]
*
i0
);
}
template
<
typename
_Tp
>
inline
const
_Tp
&
Mat
::
at
(
int
i0
)
const
template
<
typename
_Tp
>
inline
const
_Tp
&
Mat
::
at
(
int
i0
)
const
{
return
*
(
const
_Tp
*
)
ptr
(
i0
);
}
{
CV_DbgAssert
(
dims
<=
2
&&
data
&&
(
size
.
p
[
0
]
==
1
||
size
.
p
[
1
]
==
1
)
&&
(
unsigned
)
i0
<
(
unsigned
)(
size
.
p
[
0
]
+
size
.
p
[
1
]
-
1
)
&&
elemSize
()
==
CV_ELEM_SIZE
(
DataType
<
_Tp
>::
type
)
);
return
*
(
_Tp
*
)(
data
+
step
.
p
[
size
.
p
[
0
]
==
1
]
*
i0
);
}
template
<
typename
_Tp
>
inline
_Tp
&
Mat
::
at
(
int
i0
,
int
i1
,
int
i2
)
template
<
typename
_Tp
>
inline
_Tp
&
Mat
::
at
(
int
i0
,
int
i1
,
int
i2
)
{
return
*
(
_Tp
*
)
ptr
(
i0
,
i1
,
i2
);
}
{
CV_DbgAssert
(
elemSize
()
==
CV_ELEM_SIZE
(
DataType
<
_Tp
>::
type
)
);
return
*
(
_Tp
*
)
ptr
(
i0
,
i1
,
i2
);
}
template
<
typename
_Tp
>
inline
const
_Tp
&
Mat
::
at
(
int
i0
,
int
i1
,
int
i2
)
const
template
<
typename
_Tp
>
inline
const
_Tp
&
Mat
::
at
(
int
i0
,
int
i1
,
int
i2
)
const
{
return
*
(
const
_Tp
*
)
ptr
(
i0
,
i1
,
i2
);
}
{
CV_DbgAssert
(
elemSize
()
==
CV_ELEM_SIZE
(
DataType
<
_Tp
>::
type
)
);
return
*
(
const
_Tp
*
)
ptr
(
i0
,
i1
,
i2
);
}
template
<
typename
_Tp
>
inline
_Tp
&
Mat
::
at
(
const
int
*
idx
)
template
<
typename
_Tp
>
inline
_Tp
&
Mat
::
at
(
const
int
*
idx
)
{
return
*
(
_Tp
*
)
ptr
(
idx
);
}
{
CV_DbgAssert
(
elemSize
()
==
CV_ELEM_SIZE
(
DataType
<
_Tp
>::
type
)
);
return
*
(
_Tp
*
)
ptr
(
idx
);
}
template
<
typename
_Tp
>
inline
const
_Tp
&
Mat
::
at
(
const
int
*
idx
)
const
template
<
typename
_Tp
>
inline
const
_Tp
&
Mat
::
at
(
const
int
*
idx
)
const
{
return
*
(
const
_Tp
*
)
ptr
(
idx
);
}
{
CV_DbgAssert
(
elemSize
()
==
CV_ELEM_SIZE
(
DataType
<
_Tp
>::
type
)
);
return
*
(
const
_Tp
*
)
ptr
(
idx
);
}
template
<
typename
_Tp
>
inline
MatConstIterator_
<
_Tp
>
Mat
::
begin
()
const
template
<
typename
_Tp
>
inline
MatConstIterator_
<
_Tp
>
Mat
::
begin
()
const
...
@@ -688,7 +711,9 @@ static inline Mat cvarrToMatND(const CvArr* arr, bool copyData=false, int coiMod
...
@@ -688,7 +711,9 @@ static inline Mat cvarrToMatND(const CvArr* arr, bool copyData=false, int coiMod
{
{
return
cvarrToMat
(
arr
,
copyData
,
true
,
coiMode
);
return
cvarrToMat
(
arr
,
copyData
,
true
,
coiMode
);
}
}
///////////////////////////////////////////// SVD //////////////////////////////////////////////////////
inline
SVD
::
SVD
()
{}
inline
SVD
::
SVD
()
{}
inline
SVD
::
SVD
(
const
Mat
&
m
,
int
flags
)
{
operator
()(
m
,
flags
);
}
inline
SVD
::
SVD
(
const
Mat
&
m
,
int
flags
)
{
operator
()(
m
,
flags
);
}
inline
void
SVD
::
solveZ
(
const
Mat
&
m
,
Mat
&
dst
)
inline
void
SVD
::
solveZ
(
const
Mat
&
m
,
Mat
&
dst
)
...
@@ -1015,6 +1040,7 @@ process( const Mat_<T1>& m1, const Mat_<T2>& m2, Mat_<T3>& m3, Op op )
...
@@ -1015,6 +1040,7 @@ process( const Mat_<T1>& m1, const Mat_<T2>& m2, Mat_<T3>& m3, Op op )
}
}
}
}
//////////////////////////////////// Matrix Expressions /////////////////////////////////////////
class
CV_EXPORTS
MatOp
class
CV_EXPORTS
MatOp
{
{
...
@@ -1526,7 +1552,7 @@ template<typename _Tp> inline MatExpr Mat_<_Tp>::eye(Size sz)
...
@@ -1526,7 +1552,7 @@ template<typename _Tp> inline MatExpr Mat_<_Tp>::eye(Size sz)
return
Mat
::
eye
(
sz
,
DataType
<
_Tp
>::
type
);
return
Mat
::
eye
(
sz
,
DataType
<
_Tp
>::
type
);
}
}
////////////
Iterators & Comma initializers
//////////////////
////////////
//////////////////// Iterators & Comma initializers ////////////////
//////////////////
inline
MatConstIterator
::
MatConstIterator
()
inline
MatConstIterator
::
MatConstIterator
()
:
m
(
0
),
elemSize
(
0
),
ptr
(
0
),
sliceStart
(
0
),
sliceEnd
(
0
)
{}
:
m
(
0
),
elemSize
(
0
),
ptr
(
0
),
sliceStart
(
0
),
sliceEnd
(
0
)
{}
...
...
modules/core/src/array.cpp
View file @
8af83e6d
...
@@ -304,7 +304,11 @@ cvCloneMatND( const CvMatND* src )
...
@@ -304,7 +304,11 @@ cvCloneMatND( const CvMatND* src )
if
(
src
->
data
.
ptr
)
if
(
src
->
data
.
ptr
)
{
{
cvCreateData
(
dst
);
cvCreateData
(
dst
);
cvCopy
(
src
,
dst
);
cv
::
Mat
_src
(
src
),
_dst
(
dst
);
uchar
*
data0
=
dst
->
data
.
ptr
;
_src
.
copyTo
(
_dst
);
CV_Assert
(
_dst
.
data
==
data0
);
//cvCopy( src, dst );
}
}
return
dst
;
return
dst
;
...
...
modules/core/src/matrix.cpp
View file @
8af83e6d
...
@@ -511,6 +511,10 @@ void Mat::reserve(size_t nelems)
...
@@ -511,6 +511,10 @@ void Mat::reserve(size_t nelems)
return
;
return
;
int
r
=
size
.
p
[
0
];
int
r
=
size
.
p
[
0
];
if
(
(
size_t
)
r
>=
nelems
)
return
;
size
.
p
[
0
]
=
std
::
max
((
int
)
nelems
,
1
);
size
.
p
[
0
]
=
std
::
max
((
int
)
nelems
,
1
);
size_t
newsize
=
total
()
*
elemSize
();
size_t
newsize
=
total
()
*
elemSize
();
...
@@ -534,6 +538,8 @@ void Mat::reserve(size_t nelems)
...
@@ -534,6 +538,8 @@ void Mat::reserve(size_t nelems)
void
Mat
::
resize
(
size_t
nelems
)
void
Mat
::
resize
(
size_t
nelems
)
{
{
int
saveRows
=
size
.
p
[
0
];
int
saveRows
=
size
.
p
[
0
];
if
(
saveRows
==
(
int
)
nelems
)
return
;
CV_Assert
(
(
int
)
nelems
>=
0
);
CV_Assert
(
(
int
)
nelems
>=
0
);
if
(
isSubmatrix
()
||
data
+
step
.
p
[
0
]
*
nelems
>
datalimit
)
if
(
isSubmatrix
()
||
data
+
step
.
p
[
0
]
*
nelems
>
datalimit
)
...
@@ -725,12 +731,17 @@ Mat Mat::reshape(int new_cn, int new_rows) const
...
@@ -725,12 +731,17 @@ Mat Mat::reshape(int new_cn, int new_rows) const
hdr
.
cols
=
new_width
;
hdr
.
cols
=
new_width
;
hdr
.
flags
=
(
hdr
.
flags
&
~
CV_MAT_CN_MASK
)
|
((
new_cn
-
1
)
<<
CV_CN_SHIFT
);
hdr
.
flags
=
(
hdr
.
flags
&
~
CV_MAT_CN_MASK
)
|
((
new_cn
-
1
)
<<
CV_CN_SHIFT
);
hdr
.
step
[
1
]
=
CV_ELEM_SIZE
(
hdr
.
flags
);
return
hdr
;
return
hdr
;
}
}
/*************************************************************************************************\
Matrix Operations
\*************************************************************************************************/
void
//////////////////////////////////////// set identity ////////////////////////////////////////////
setIdentity
(
Mat
&
m
,
const
Scalar
&
s
)
void
setIdentity
(
Mat
&
m
,
const
Scalar
&
s
)
{
{
CV_Assert
(
m
.
dims
<=
2
);
CV_Assert
(
m
.
dims
<=
2
);
int
i
,
j
,
rows
=
m
.
rows
,
cols
=
m
.
cols
,
type
=
m
.
type
();
int
i
,
j
,
rows
=
m
.
rows
,
cols
=
m
.
cols
,
type
=
m
.
type
();
...
@@ -768,6 +779,8 @@ setIdentity( Mat& m, const Scalar& s )
...
@@ -768,6 +779,8 @@ setIdentity( Mat& m, const Scalar& s )
}
}
}
}
//////////////////////////////////////////// trace ///////////////////////////////////////////
Scalar
trace
(
const
Mat
&
m
)
Scalar
trace
(
const
Mat
&
m
)
{
{
CV_Assert
(
m
.
dims
<=
2
);
CV_Assert
(
m
.
dims
<=
2
);
...
@@ -797,10 +810,8 @@ Scalar trace( const Mat& m )
...
@@ -797,10 +810,8 @@ Scalar trace( const Mat& m )
return
cv
::
sum
(
m
.
diag
());
return
cv
::
sum
(
m
.
diag
());
}
}
/****************************************************************************************\
////////////////////////////////////// transpose /////////////////////////////////////////
* transpose *
\****************************************************************************************/
template
<
typename
T
>
static
void
template
<
typename
T
>
static
void
transposeI_
(
Mat
&
mat
)
transposeI_
(
Mat
&
mat
)
{
{
...
@@ -968,9 +979,7 @@ Mat Mat::cross(const Mat& m) const
...
@@ -968,9 +979,7 @@ Mat Mat::cross(const Mat& m) const
}
}
/****************************************************************************************\
////////////////////////////////////////// reduce ////////////////////////////////////////////
* Reduce Mat to vector *
\****************************************************************************************/
template
<
typename
T
,
typename
ST
,
class
Op
>
static
void
template
<
typename
T
,
typename
ST
,
class
Op
>
static
void
reduceR_
(
const
Mat
&
srcmat
,
Mat
&
dstmat
)
reduceR_
(
const
Mat
&
srcmat
,
Mat
&
dstmat
)
...
@@ -1178,6 +1187,8 @@ void reduce(const Mat& src, Mat& dst, int dim, int op, int dtype)
...
@@ -1178,6 +1187,8 @@ void reduce(const Mat& src, Mat& dst, int dim, int op, int dtype)
temp
.
convertTo
(
dst
,
dst
.
type
(),
1.
/
(
dim
==
0
?
src
.
rows
:
src
.
cols
));
temp
.
convertTo
(
dst
,
dst
.
type
(),
1.
/
(
dim
==
0
?
src
.
rows
:
src
.
cols
));
}
}
//////////////////////////////////////// sort ///////////////////////////////////////////
template
<
typename
T
>
static
void
sort_
(
const
Mat
&
src
,
Mat
&
dst
,
int
flags
)
template
<
typename
T
>
static
void
sort_
(
const
Mat
&
src
,
Mat
&
dst
,
int
flags
)
{
{
...
@@ -1307,6 +1318,10 @@ void sortIdx( const Mat& src, Mat& dst, int flags )
...
@@ -1307,6 +1318,10 @@ void sortIdx( const Mat& src, Mat& dst, int flags )
func
(
src
,
dst
,
flags
);
func
(
src
,
dst
,
flags
);
}
}
////////////////////////////////////////// kmeans ////////////////////////////////////////////
static
void
generateRandomCenter
(
const
vector
<
Vec2f
>&
box
,
float
*
center
,
RNG
&
rng
)
static
void
generateRandomCenter
(
const
vector
<
Vec2f
>&
box
,
float
*
center
,
RNG
&
rng
)
{
{
size_t
j
,
dims
=
box
.
size
();
size_t
j
,
dims
=
box
.
size
();
...
@@ -2850,7 +2865,6 @@ void normalize( const SparseMat& src, SparseMat& dst, double a, int norm_type )
...
@@ -2850,7 +2865,6 @@ void normalize( const SparseMat& src, SparseMat& dst, double a, int norm_type )
src
.
convertTo
(
dst
,
-
1
,
scale
);
src
.
convertTo
(
dst
,
-
1
,
scale
);
}
}
}
}
/* End of file. */
/* End of file. */
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment