OpenCV矩阵(向量)运算

2019-04-13 21:20发布

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]

归一化

(