相关文章推荐
自信的楼梯  ·  SpringBoot ...·  9 月前    · 
自信的楼梯  ·  variable-extractor·  11 月前    · 
自信的楼梯  ·  Functions for Use in ...·  11 月前    · 
自信的楼梯  ·  Spring Expression ...·  11 月前    · 
严肃的皮蛋  ·  Retrieve Original ...·  18 小时前    · 
严肃的围巾  ·  C++内部函数与外部函数 | ...·  18 小时前    · 
性感的绿豆  ·  SQL ...·  18 小时前    · 
完美的充值卡  ·  A Basic AWS Lambda ...·  18 小时前    · 

C++与Eigen、OpenCV库的个人使用记录

一、Eeign库

1. Eigen矩阵定义

// 定义静态矩阵
Matrix<double, 3, 4> A;               // 3行4列double型矩阵
// 定义动态矩阵
Matrix<double, 3, Dynamic> B;         // 3行动态列double型矩阵
Matrix<double, Dynamic, Dynamic> C;   // 动态行动态列double型矩阵
// 引入行优先关键字
Matrix<double, 3, 3, RowMajor> D;     // 引入行优先关键字RowMajor
// Eigen默认矩阵库
Matrix3f P;                     // 3行3列float型矩阵
Vector3f x;                     // 3维列向量,float型
RowVector3f a;                  // 3维行向量,float型
VectorXd v;                     // 动态列向量,double型

1.1 动态矩阵与静态矩阵

Eigen的矩阵分为动态矩阵与静态矩阵。动态矩阵是指其大小在运行时确定,静态矩阵是指其大小在编译时确定。

定义动态矩阵,引入关键字Dynamic 
注:需引入命名空间才可直接使用关键字
Dynamic using namespace Eigen; 

1.2 行优先与列优先

Eigen矩阵在存储时为默认为列优先(ColMajor)。行优先(RowMajor)与列优先(ColMajor)存储主要影响矩阵遍历的效率以及与其他库多联合开发(多数库默认为列优先)。

如对于矩阵 A=\left[ \begin{matrix} 1 & 5 & 3 & 2 \\ 3 & 7 & 2 & 4 \\ 5 & 8 & 9 & 6 \\ \end{matrix} \right] 在内存中存储时,

(1)行优先存储形式:1 5 3 2 3 7 2 4 5 8 9 6
(2)列优先存储形式:1 3 5 5 7 8 9 8 3 8 4 6

当行遍历操作较多时,使用行优先存储矩阵可以提高寻址速度。

2.Eigen矩阵基本操作

// 直接操作矩阵元素的值
A(1,1) = 1.f;  // A矩阵第2行第2列元素赋值为1
A << 1, 2, 3, 4,
     4, 5, 6, 7,
     7, 8, 9, 10;
A.size();  // 矩阵A元素的个数
A.rows();  // 矩阵A行数
A.cols();  // 矩阵A列数
A.fill(10);  // 用10填充整个矩阵 
A.transpose(); // 矩阵A的转置矩阵
A.adjoint();  // 矩阵A的伴随矩阵
A.inverse();  // 矩阵A的逆矩阵
A.determinant();  // 矩阵A的行列式值
// 对于向量,可以使用中括号作为索引[]
x[0] = 1;  // 等价于x(0)=1
// 利用ldlt()方法求解Ax=b
Matrix2f x = A.ldlt().solve(b);  
// 动态矩阵操作
MatrixXf AtA, AtB;
Matrix2f A, B;
A << 2, -1, -1, 3;
B << 1,2,3,1;
AtA.multiply_AtA(A)  // AtA = A*A,做矩阵乘法,将A与A矩阵乘法赋到动态矩阵AtA中
AtB.multiply_AtB(A,B)  // AtB = A*B

二、OpenCV库

1.读写与显示图像

string path = "demo.png";
cv::Mat color;
color = cv::imread(path);  // 读取图片,格式为Mat
cv::imshow("image", color);  // 显示图片
cv::imwrite("test.jpg", color);  // 将
cv::waitKey(0);

2.Mat矩阵基本操作

2.1 单通道Mat矩阵值的访问

cv::Mat img_single = (320, 640, CV_8UC1, Scalar(0));  // 定义单通道
img_single.ptr<float>(i)[j];  // 访问第i行j列灰度值

2.2 多通道图像Mat矩阵值的访问

第0行第0-2列的3个值分别为像素点(0,0)的BGR三个通道的灰度值
cv::Mat img_BGR = (320, 640, CV_8UC3, Scalar(0, 0 ,0));  // 定义三通道BGR图像
// 基于指针方法访问
img_BGR.ptr<float>(i)[j*3];  // 第i行j列B通道灰度值
 
推荐文章