Lab2-1 从零玩转Eigen库:掌握线性代数与OpenCV互操作的神器(一)
参考自同济大学蒋磊老师编写的IPMV实验说明
同济大学自动化专业IMPV课程学习记录 (包含知识点以及实验)
Lab0 实验环境准备与OpenCV Hello World
Lab1-1 OpenCV入门与实践——从基础操作到实时视频处理(一)
Lab1-2 OpenCV入门与实践——从基础操作到实时视频处理(二)
Lab2-1 从零玩转Eigen库:掌握线性代数与OpenCV互操作的神器!(一)
Lab2-2 从零玩转Eigen库:掌握线性代数与OpenCV互操作的神器!(二)
Lab4 Blending 线性混合与拉普拉斯金字塔混合对比
…
待更新
文章目录
引言:在计算机视觉和机器学习领域,线性代数运算是不可或缺的核心技能。而Eigen库作为C++中最强大的线性代数库之一,以其高效、易用的特性深受开发者喜爱。本文将带你从零开始,手把手教你掌握Eigen库的基本操作,并实现与OpenCV的无缝互操作,让你在图像处理中如虎添翼!
0 任务
- 掌握 Eigen 库的基本操作
- 掌握基本的线性代数运算
- 实现 Eigen 与 OpenCV 之间的互操作
1 Eigen 库:线性代数的瑞士军刀
Eigen
是一个开源的 C++ 模板库,专注于线性代数运算。它支持矩阵、向量、数值求解器等操作,性能优越且接口友好。无论是学术研究还是工业应用,Eigen都是处理线性代数问题的首选工具。
1.0 创建实验项目
使用以下 CMakeLists 文件创建一个实验项目:
cmake_minimum_required(VERSION 3.5.1) # 设置CMake最低版本
project(LAB2) # 设置项目名称
# 查找Eigen库
find_package(Eigen3 REQUIRED)
# 添加可执行文件
add_executable(${PROJECT_NAME} task1_1.cpp)
# 设置C++标准
set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON) # 指定使用 C++17 标准进行编译
# 链接Eigen库
target_link_libraries(${PROJECT_NAME} PRIVATE Eigen3::Eigen)
1.1 快速上手:创建矩阵与向量
我们先从最简单的操作开始:创建矩阵和向量,并用随机值初始化它们。
示例代码:
#include <eigen3/Eigen/Dense>
#include <iostream>
int main(){
// Create a 3x3 random matrix
Eigen::MatrixXd mat = Eigen::MatrixXd::Random(3,3);
std::cout << "Random matrix:\n" << mat << std::endl;
// Create a 3-dimensional random vector
Eigen::MatrixXd vec = Eigen::VectorXd::Random(3);
std::cout << "Random vector:\n" << vec << std::endl;
return 0;
}
运行结果会输出一个 3 x 3 的随机矩阵和一个 3 维随机向量。是不是很简单?
1.2 块操作:精准修改矩阵
Eigen 提供了强大的块操作功能,可以轻松修改矩阵的局部区域。例如,我们有一个 4 x 4 的矩阵:
[ 1 2 3 0 4 5 6 7 7 8 9 8 3 6 9 11 ] (1.1) \begin{bmatrix} 1 & 2 & 3 & 0 \\ 4 & 5 & 6 & 7 \\ 7 & 8 & 9 & 8 \\ 3 & 6 & 9 & 11 \\ \end{bmatrix} \tag{1.1} 14732586369907811 (1.1)
我们希望将第3、4行和第1、2列的区域替换为:
[ 0 1 1 0 ] (1.2) \begin{bmatrix} 0 & 1 \\ 1 & 0 \\ \end{bmatrix} \tag{1.2} [0110](1.2)
即修改后矩阵应为:
[ 1 2 3 0 4 5 6 7 0 1 9 8 1 0 9 11 ]