Opencv 矩阵(向量)运算
四则运算
代码如下:
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矩阵的行列数完全一致。
代码如下:
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]
那么,有时候我们需要得到两个同型矩阵对应位相乘的结果,即:
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]
归一化
令
归一化后,即为:
代码如下:
Vec3f v0(1, 0, 1), v1(3, 2, 1), v2, v3;
v2 = v0.dot(v1);
cout << v2 << endl;
v3 = normalize(v2);
cout << v3 << endl;
输出:
[4, 0, 0]
[1, 0, 0]
以上,
我将在下一篇中,举出例子具体应用这些操作