Opencv 矩阵(向量)运算
四则运算
⎛⎝⎜⎜100010001⎞⎠⎟⎟+⎛⎝⎜⎜100010001⎞⎠⎟⎟=⎛⎝⎜⎜200020002⎞⎠⎟⎟
代码如下:
cv::Mat a= Mat::eye(Size(3,3), CV_32F)
cv::Mat b= Mat::ones(Size(3,3), CV_32F)
cv::Mat c= a+b
cv::Mat d= a-b
cout << a << endl << b << endl << c << endl << d << endl
输出如下:
[1, 0, 0;
0, 1, 0;
0, 0, 1]
[1, 1, 1;
1, 1, 1;
1, 1, 1]
[2, 1, 1;
1, 2, 1;
1, 1, 2]
[0, -1, -1;
-1, 0, -1;
-1, -1, 0]
点乘
向量点乘
(a, b, c) * (x, y, z) = ax + by + cz
代码:
Vec3f v0(1, 0, 1), v1(3, 2, 1);
cout << v0.dot(v1);
输出为:4
矩阵点乘
Mat矩阵的dot方法扩展了一维向量的点乘操作,把整个Mat矩阵扩展成一个行(列)向量,之后执行向量的点乘运算,仍然要求参与dot运算的两个Mat矩阵的行列数完全一致。
(a1a2b1b2c1c2)∗⎛⎝⎜⎜d1d2d3e1e2e3⎞⎠⎟⎟=(a1∗d1+b1∗d2+c1∗d3a2∗d1+b2∗d2+c2∗d3a1∗e1+b1∗e2+c1∗e3a2∗e1+b2∗e2+c2∗e3)
代码如下:
cv::Mat a= Mat::eye(Size(3,3), CV_32F);
cv::Mat b= Mat::ones(Size(3,3), CV_32F);
cout << a * b << endl;
输出如下:
[1, 1, 1;
1, 1, 1;
1, 1, 1]
那么,有时候我们需要得到两个同型矩阵对应位相乘的结果,即:
(a1a2b1b2c1c2).∗(d1d2e1e2f1f2)=(a1∗d1a2∗d2b1∗e1b2∗e2c1∗f1c2∗f2)
cv::Mat a= Mat::eye(Size(3,3), CV_32F);
cv::Mat b= Mat::ones(Size(3,3), CV_32F);
cv::Mat c = a.mul(b);
cout << c << endl;
输出结果:
[1, 0, 0;
0, 1, 0;
0, 0, 1]
叉乘
向量v1与v2叉乘即求得与v1和v2所在面的法向量
代码:
Vec3f v0(1,0,0), v1(0,1,0);
Vec3f vn = v0.cross(v1);
cout << vn << endl;
输出结果为:
[0, 0, 1]
转置
转置的概念非常好理解,以下是代码:
cv::Mat a= Mat::eye(Size(2,3), CV_32F)
cv::Mat b= a.t()
cout << a << endl
cout << b << endl
输出:
[1, 0;
0, 1;
0, 0]
[1, 0, 0;
0, 1, 0]
归一化
(