OpenCV矩阵运算

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 (专门用于对称,速度是 LU2) , 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的 mask0255
按位运算: 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 ,返回的 dstA的类型一样
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 = trueMij = 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可以计算出最长向量、向量距离和、向量距离和的算术平方根
solveCubic3次方程, solvePolyn次方程
排列: 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

猜你喜欢

转载自blog.csdn.net/merryken/article/details/44097079