OpenCV矩阵(向量)运算

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=(a1d1+b1d2+c1d3a2d1+b2d2+c2d3a1e1+b1e2+c1e3a2e1+b2e2+c2e3)

代码如下:

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)=(a1d1a2d2b1e1b2e2c1f1c2f2)

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]

归一化

(a1a2b1b2c1c2)

n=a1+a2+b1+b2+c1+c2
归一化后,即为:
(a1/na2/nb1/nb2/nc1/nc2/n)
代码如下:

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]

以上,
我将在下一篇中,举出例子具体应用这些操作

猜你喜欢

转载自blog.csdn.net/SarKerson/article/details/77165599