在Raspberry Pi OS上安装Eigen/CMake/Opencv

1 准备

处理器:Raspberry Pi 4B, 4GB内存
OS:Raspberry pi OS (Raspbian)- 32bit 无desktop版本 OS镜像:2021-05-07-raspios-buster-armhf-lite.img

2 安装CMake

CMake源码版本:cmake-3.20.5.tar.gz, 官方下载地址: https://cmake.org/download/
安装方法请参考:https://www.cnblogs.com/yanqingyang/p/12731855.html

# 检查是否已经安装了g++
g++ --version

# 若没有安装g++, 则执行下面指令,否则跳过
sudo apt-get install g++

# 安装依赖
sudo apt-get install libssl-dev

# 进入安装包目录,并解压:
tar -zxvf cmake-3.20.5.tar.gz

# 解压完成后,进入到解压后的cmake目录, 然后执行
cd cmake-3.20.5
./bootstrap

# 编译cmake源码
sudo make -j4

# 安装cmake
sudo make install

# 验证安装版本
cmake --version

3 安装Eigen3.4.0

(1) 安装过程

从官网下载Eigen源代码: eigen-3.4.0.tar.gz, 然后安装下面的指令顺序执行:

tar -zxvf eigen-3.4.0.tar.gz
cd eigen-3.4.0

mkdir build 
cd build
cmake ..
sudo make install

注意:lib被安装到了 /usr/local/include/eigen3这个路径下了,一些开源代码通常用#include <Eigen/Dense>引用,所以将 /usr/local/include/eigen3这个路径下的Eigen目录递归拷贝到上一级目录中,执行下面指令:

cp -r /usr/local/include/eigen3/Eigen /usr/local/include

(2)测试demo

新建一个cpp文件:test_eigen.cpp, 然后把下面的代码贴进去。【代码来源:视觉SLAM14讲】

#include <iostream>
using namespace std;
#include <ctime>
//eigen核心部分
#include <Eigen/Core>
//稠密矩阵的代数运算(逆、特征值等)
#include <Eigen/Dense>
using namespace Eigen;
#define MATRIX_SEZE 50

int main(int argc, char **argv)
{
    //声明一个2*3的矩阵,eigen中所有的向量矩阵均为Eigen::Matrix,是一个模板类。
    //三个参数分别为数据类型、行数、列数
    Matrix<float, 2, 3> matrix_23;

    //声明一个三维向量,Vector_3d实际上是一个通过typedef定义的内置类型,本质上仍然是Eigen::Matrix模板类
    Vector3d v_3d;
    //Matrix<float, 2, 3> vd_3d;

    //声明一个3*3的矩阵,并初始化为0矩阵
    Matrix3d matrix_33 = Matrix3d::Zero();

    //不确定矩阵大小时,可以使用动态大小的矩阵
    Matrix<double, Dynamic, Dynamic> matrix_dynamic;

    //或者更简单的方式
    MatrixXd matrix_x;

    //准备对Eigen矩阵初始化
    //输入数据
    matrix_23 << 1, 2, 3, 4, 5, 6;
    //shuchu
    cout << "matrix 2*3 from 1 to 6 : \n"<< matrix_23 << endl;

    //使用()访问矩阵中的元素
    cout << "print matirx 2*3 : "<< endl;
    for (int i = 0; i < 2; ++i)
    {
        for (int j = 0; j < 3; ++j)
        {
            cout << matrix_23(i,j) << "\t";
        }
        cout << endl;
    }

    //初始化两个三维向量
    v_3d << 3, 2, 1;
    //vd_3d << 4, 5, 6;
    //不能混乘两种类型的矩阵,因此需要显示转换类型:.cast<type>
    Matrix<double, 2, 1> result = matrix_23.cast<double>() * v_3d;
    cout << "[1,2,3;4,5,6]*[3,2,1] = "<< result.transpose() << endl;
    //.transpose()是转置函数
    cout << "not transpose [1,2,3;4,5,6]*[3,2,1] = "<< result << endl;

    Matrix<float, 2, 1> result2 = matrix_23 * v_3d.cast<float>();
    cout << "[1,2,3;4,5,6]*[3,2,1] = "<< result2.transpose() << endl;

    //生成一个随机矩阵
    matrix_33 = Matrix3d::Random();
    cout << "random matrix: \n"<< matrix_33 << endl;
    cout << "transpose : \n"<< matrix_33.transpose() << endl;  //转置
    cout << "sum :" << matrix_33.sum() << endl;                //求和
    cout << "trace : "<< matrix_33.trace() << endl;            //求迹
    cout << "time 10: \n"<< 10 * matrix_33 << endl;            //数乘
    cout << "inverse : \n"<< matrix_33.inverse() << endl;      //求逆
    cout << "det : \n"<< matrix_33.determinant() << endl;      //求行列式

    //求特征值
    //实对称矩阵可以保证对角化成功
    SelfAdjointEigenSolver<Matrix3d> eigen_solver(matrix_33.transpose() * matrix_33);   //SelfAdjointEigenSolver<Matrix3d>y用于求解特征值和特征向量
    cout << "Eigen values = \n" << eigen_solver.eigenvalues() << endl;
    cout << "Eigen vectors = \n" << eigen_solver.eigenvectors() << endl;

    //练习求解方程
    //求解Matrix_NN * x = v_NN方程
    Matrix<double, MATRIX_SEZE, MATRIX_SEZE> matrix_NN
        = MatrixXd::Random(MATRIX_SEZE,MATRIX_SEZE);     //MATRIX_SEZE在前面宏定义中
    matrix_NN = matrix_NN *matrix_NN.transpose();        //此处理可以保证矩阵是半正定的
    Matrix<double, MATRIX_SEZE, 1> v_Nd = MatrixXd::Random(MATRIX_SEZE, 1);

    clock_t time_stt = clock();                          //用于计时

    //直接求逆
    Matrix<double, MATRIX_SEZE, 1> x = matrix_NN.inverse() * v_Nd;
    cout << "time of normal inverse is"
        << 1000 * (clock() - time_stt) / (double) CLOCKS_PER_SEC << "ms" << endl;
    cout << "x = "<< x.transpose() << endl;

    //再用矩阵分解,例如QR分解求解,速度将会快很多
    time_stt = clock();
    x = matrix_NN.colPivHouseholderQr().solve(v_Nd);
    cout << "time of Qr decomposition is "
       << 1000 * (clock() - time_stt) / (double) CLOCKS_PER_SEC << "ms" << endl;
    cout << "x = " << x.transpose() << endl;

    //对于正定矩阵,还可以用cholesky分解来分解方程
    time_stt = clock();
    x = matrix_NN.ldlt().solve(v_Nd);
    cout << "time of ldlt decomposition is "
       << 1000 * (clock() - time_stt) / (double) CLOCKS_PER_SEC << "ms" << endl;
    cout << "x = " << x.transpose() << endl;

    return 0;
}

使用下面的指令编译、链接、生成可执行文件、并运行:

g++ test_eigen.cpp -o test_eigen  # 编译
ls -l #查看生成文件
./test_eigen  #运行

4 安装opencv

从github上下载源码tar包, 也可以git clone。
在这里插入图片描述
安装步骤:

(1) 安装依赖

// build required

sudo apt-get install build-essential

// required

sudo apt-get install libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev

// optional

sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

(2) 编译、安装

tar -zxvf opencv-4.5.4.tar.gz
cd opencv-4.5.4
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
sudo make -j4
sudo make install
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值