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矩阵值的访问
cv::Mat img_BGR = (320, 640, CV_8UC3, Scalar(0, 0 ,0)); // 定义三通道BGR图像
// 基于指针方法访问
img_BGR.ptr<float>(i)[j*3]; // 第i行j列B通道灰度值