1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
|
一、矩阵
Mat
I
,
img
,
I1
,
I2
,
dst
,
A
,
B
;
double
k
,
alpha
;
Scalar
s
;
1.加法
I
=
I1
+
I2
;
//等同add(I1,I2,I);
add
(
I1
,
I2
,
dst
,
mask
,
dtype
)
;
scaleAdd
(
I1
,
scale
,
I2
,
dst
)
;
//dst=scale*I1+I2;
2.减法
absdiff
(
I1
,
I2
,
I
)
;
//I=|I1-I2|;
A
-
B
;
A
-
s
;
s
-
A
;
-
A
;
subtract
(
I1
,
I2
,
dst
)
;
3.乘法
I
=
I
.
mul
(
I
)
;
//点乘,I.mul(I,3);-->I=3*I.^2
Mat
C
=
A
.
mul
(
5
/
B
)
;
//==divide(A,B,C,5);
A
*
B
;矩阵相乘
I
=
alpha
*
I
;
Mat
::
cross
(
Mat
)
;
//三维向量(或矩阵)的叉乘,A.cross(B)
double
Mat
::
dot
(
Mat
)
;
//2个向量(或矩阵)的点乘的结果,A.dot(B)
mul
--
--
--
-
multiply
pow
(
src
,
double
p
,
dst
)
;
//如果p是整数dst(I)=src(I)^p;其他|src(I)|^p
4.除法
divide
(
I1
,
I2
,
dst
,
scale
,
int
dtype
=
-
1
)
;
//dst=saturate_cast(I1*scale/I2);
A
/
B
;
alpha
/
A
;都是点除
5.转换
I
.
convertTo
(
I1
,
CV_32F
)
;
//类型转换
A
.
t
(
)
;
//转置
flip
(
I
,
dst
,
int
flipCode
)
;
//flipCode=0是上下翻转,>0时左右翻转,<0时一起来
sqrt
(
I
,
dst
)
;
cvtColor
(
I
,
dst
,
int
code
,
int
dstCn
=
0
)
;
resize
:对图像进行形变
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
6.其他
Scalar
s
=
sum
(
I
)
;各通道求和
norm
,
countNonZero
,
trace
,
determinant
,
repeat都是返回
Mat或者
Scalar
countNonZero
:用来统计非零的向量个数
.
(
rows
*
cols个
)
Scalar
m
=
mean
(
I
)
;
//各通道求平均
Mat
RowClone
=
C
.
row
(
1
)
.
clone
(
)
;
//复制第2行
addWeight
(
I1
,
alpha
,
I2
,
beta
,
gamma
,
dst
,
int
dtype
=
-
1
)
;
//dst=saturate(alpha*I1+beta*I2+gamma);dtype是dst的深度
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
7.运算符
log10
(
)
exp
(
I
,
dst
)
;
//dst=exp(I);计算每个数组元素的指数
log
(
I
,
dst
)
;
//如果Iij!=0;则dstij=log(|Iij|)
randu
(
I
,
Scalar
::
all
(
0
)
,
Scalar
::
all
(
255
)
)
;
Mat
::
t
(
)转置
Mat
::
inv
(
int
method
=
DECOMP_LU
)求逆。
method
=
DECOMP_CHOLESKY
(专门用于对称,速度是
LU的
2倍
)
,
DECOMP_SVD
//A.inv();A.inv()*B;
invert
(
I1
,
dst
,
int
method
=
DECOMP_LU
)
;
//用法同上
MatExpr
abs
(
Mat
)
//求绝对值
A
cmpop
B
;
A
compop
alpha
;
alpha
cmpop
A
;这里
cmpop表示
>
,
>=
,
==
,
!=
,
<=
,
<等,结果是
CV
_8UC1的
mask的
0或
255
按位运算:
A
logicop
B
;
A
logicop
s
;
s
logicop
A
;
~
A
;这里
logicop代表
&
,
|
,
^
bitwise_not
(
I
,
dst
,
mask
)
;
//inverts所有的队列
还有
bitwise_and
,
bitwise_or
,
bitwise_xor
,
min
(
A
,
B
)
;
min
(
A
,
alpha
)
;
max
(
A
,
B
)
;
max
(
A
,
alpha
)
;都返回
MatExpr
,返回的
dst和
A的类型一样
double
determinant
(
Mat
)
;
//行列式
bool
eigen
(
I1
,
dst
,
int
lowindex
=
-
1
,
int
highindex
=
-
1
)
;
//
bool
eigen
(
I1
,
dst
,
I
,
int
.
.
.
)
;
//得到特征值向量dst和对应特征值的特征向量
minMaxLoc
(
I1
,
&minVal
,
&maxVal
,
Point
*
minLoc
=
0
,
Point
*
MaxLoc
=
0
,
mask
)
;
//minLoc是2D时距原点最小的点(未考证)
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
8.初始化
Mat
I
(
img
,
Rect
(
10
,
10
,
100
,
100
)
)
;
//用一块地方初始化。
Mat
I
=
img
(
Range
:
all
(
)
,
Range
(
1
,
3
)
)
;
//所有行,1~3列
Mat
I
=
img
.
clone
(
)
;
//完全复制
img
.
copyTo
(
I
)
;
//传递矩阵头
Mat
I
(
2
,
2
,
CV_8UC3
,
Scalar
(
0
,
0
,
255
)
)
;
//I=[0,0,255,0,0,255;0,0,255,0,0,255];
Mat
E
=
Mat
::
eye
(
4
,
4
,
CV_64F
)
;
//对角矩阵
Mat
O
=
Mat
::
ones
(
2
,
2
,
CV_32F
)
;
//全一矩阵
Mat
Z
=
Mat
::
zeros
(
3
,
3
,
CV_8UC1
)
;
//全零矩阵
Mat
C
=
(
Mat_
<
double
>
(
2
,
2
)
<<
0
,
-
1
,
2
,
3
)
;
//如果是简单矩阵的初始化
Mat
::
row
(
i
)
;
Mat
::
row
(
j
)
;
Mat
::
rowRange
(
start
,
end
)
;
Mat
::
colRange
(
start
,
end
)
;都只是创建个头
Mat
::
diag
(
int
d
)
;
d
=
0是是主对角线,
d
=
1是比主低的对角线
,
d
=
-
1....
static
Mat
Mat
::
diag
(
const
Mat
&
matD
)
Mat
::
setTo
(
Scalar
&s
)
;以
s初始化矩阵
Mat
::
push_back
(
Mat
)
;在原来的
Mat的最后一行后再加几行
Mat
::
pop_back
(
size_t
nelems
=
1
)
;
//移出最下面几行
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
-
9.矩阵读取和修改
(
1
)
1个通道:
for
(
int
i
=
0
;
i
<
I
.
rows
;
++
i
)
for
(
int
j
=
0
;
j
<
I
.
cols
;
++
j
)
I
.
at
<
uchar
>
(
i
,
j
)
=
k
;
(
2
)
3个通道:
Mat_
<
Vec3b
>
_I
=
I
;
//他没有4个通道寸,只有3个通道!
for
(
int
i
=
0
;
i
<
I
.
rows
;
++
i
)
for
(
int
j
=
0
;
j
<
I
.
cols
;
++
j
)
{
_I
(
i
,
j
)
[
0
]
=
b
;
_I
(
i
,
j
)
[
1
]
=
g
;
_I
(
i
,
j
)
[
2
]
=
r
;
}
I
=
_I
;
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
或者直接用
I
.
at
<
Vec3b
>
(
i
,
j
)
[
0
]
.
.
.
.
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
-
float
*
s
;
for
(
i
=
0
;
i
<
dealImg
.
rows
;
i
++
)
{
s
=
proImg
.
ptr
<
float
>
(
i
)
;
for
(
j
=
0
;
j
<
dealImg
.
cols
;
j
++
)
{
a1
=
s
[
3
*
j
+
1
]
-
m1
;
a2
=
s
[
3
*
j
+
2
]
-
m2
;
}
}
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
-
(
3
)其他机制
I
.
rows
(
0
)
.
setTo
(
Scalar
(
0
)
)
;
//把第一行清零
saturate_cast
<
uchar
>
(
.
.
.
)
;
//可以确保内容为0~255的整数
Mat
::
total
(
)
;返回一共的元素数量
size_t
Mat
::
elemSize
(
)
;返回元素的大小
:
CV_16SC3
--
>
3
*
sizeof
(
short
)
--
>
6
size_t
Mat
::
elemSize1
(
)
;返回元素一个通道的大小
CV_16SC3
--
>
sizeof
(
short
)
--
>
2
int
Mat
::
type
(
)返回他的类型
CV
_16SC3之类
int
Mat
::
depth
(
)返回深度
:
CV_16SC3
--
>
CV_16S
int
Mat
::
channels
(
)返回通道数
size_t
Mat
:
step1
(
)返回一个被
elemSize1
(
)除以过的
step
Size
Mat
::
size
(
)返回
Size
(
cols
,
rows
)
;如果大于
2维,则返回
(
-
1
,
-
1
),都是先宽再高的
bool
Mat
::
empty
(
)如果没有元素返回
1
,即
Mat
::
total
(
)
==
0或者
Mat
::
data
==
NULL
uchar
*
Mat
::
ptr
(
int
i
=
0
)指向第
i行
Mat
::
at
(
int
i
)
(
int
i
,
int
j
)
(
Point
pt
)
(
int
i
,
int
j
,
int
k
)
RNG随机类
:
next
,
float
RNG
::
uniform
(
float
a
,
float
b
)
;
.
.
double
RNG
::
gaussian
(
double
sigma
)
;
RNG
::
fill
(
I
,
int
distType
,
Mat
low
,
Mat
up
)
;
//用随机数填充
randu
(
I
,
low
,
high
)
;
randn
(
I
,
Mat
mean
,
Mat
stddev
)
;
reduce
(
I
,
dst
,
int
dim
,
int
reduceOp
,
int
dtype
=
-
1
)
;
//可以统计每行或每列的最大、最小、平均值、和
setIdentity
(
dst
,
Scalar
&value
=
Scalar
(
1
)
)
;
//把对角线替换为value
//效果等同:Mat A=Mat::eye(4,3,CV_32F)*5;
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
10.较复杂运算
gemm
(
I1
,
I2
,
alpha
,
I3
,
beta
,
dst
,
int
flags
=
0
)
;
//I1至少是浮点型,I2同I1,flags用来转置
//gemm(I1,I2,alpha,I3,beta,dst,GEMM_1_T,GEMM_3_T);-->dst=alpha*I1.t()*I2+beta*I3.t();可用此完全代替此函数
mulTransposed
(
I
,
dst
,
bool
aTa
,
Mat
delta
=
noArray
(
)
,
double
scale
=
1
,
int
rtype
=
-
1
)
;
//I是1通道的,和gemm不同,他可用于任何类型。
//如果aTa=flase时,dst=scale*(I-delta).t()*(I-delta);
//如果是true,dst=scale*(I-delta)(I-delta).t();
calcCovarMatrix
(
Mat
,
int
,
Mat
,
Mat
,
int
,
int
=
)
;
calcCovarMatrix
(
Mat
I
,
Mat
covar
,
Mat
mean
,
int
flags
,
int
=
)
;
cartToPolar
//转到极坐标
compare
(
I1
,
I2
,
dst
,
cmpop
)
;
cmpop
=
CMP_EQ
,
CMP_GT
,
CMP_GE
,
CMP_LT
,
CMP_LE
,
COM_NE
completeSymm
(
M
,
bool
lowerToUpper
=
false
)
;当
lowerToUpper
=
true时
Mij
=
Mji
(
i
<
j
)
;当为
flase时
,
Mij
=
Mji
(
i
>
j
)
变成可显示图像
:
convertScaleAbs
(
I
,
dst
,
alpha
,
beta
)
;
dst
=
saturate_cast
<
uchar
>
(
|
alpha
*
I
+
beta
|
)
;
dct
(
I
,
dst
,
int
flags
=
0
)
;
//DCT变换,1维、2维的矩阵;flags=DCT_INVERSE,DCT_ROWS
idct
,
dft
,
idft
inRange
(
I1
,
I_low
,
I_up
,
dst
)
;
//dst是CV_8UC1,在2者之间就是255
Mahalanobis
(
vec1
,
vec2
,
covar
)
;
merge
(
vector
<
Mat
>
,
Mat
)
;
//把多个Mat组合成一个和split相反
double
norm
(
.
.
.
):当
src2木有时
,
norm可以计算出最长向量、向量距离和、向量距离和的算术平方根
solveCubic解
3次方程,
solvePoly解
n次方程
排列:
sort
,
sortIdx
mixChannels
(
)
;对某个通道进行各种传递
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
-
11.未懂的函数
getConvertElem
,
extractImageCOI
,
LUT
magnitude
(
x
,
y
,
dst
)
;
//I1,I2都是1维向量,dst=sqrt(x(I)^2+y(I)^2);
meanStdDev
,
MulSpectrums
(
I1
,
I2
,
dst
,
flags
)
;傅里叶
normalize
(
I
,
dst
,
alpha
,
beta
,
int
normType
=
NORM_L2
,
int
rtype
=
-
1
,
mask
)
;
//归一化
PCA
,
SVD
,
solve
,
transform
,
transpose
二、其他数据结构
Point2f
P
(
5
,
1
)
;
Point3f
P3f
(
2
,
6
,
7
)
;
vector
<
float
>
v
;
v
.
push_back
(
(
float
)
CV_PI
)
;
v
.
push_back
(
2
)
;
v
.
push_back
(
3.01f
)
;
//不断入
vector
<
Point2f
>
vPoints
(
20
)
;
//一次定义20个
三、常用方法
Mat
mask
=
src
<
0
;这样很快建立一个
mask了
四、以后可能用到的函数
randShuffle
,
repeat
|
OpenCV矩阵运算
最新推荐文章于 2023-08-18 08:41:42 发布