opencv与eigen做svd的一些区别。

主要想用eigen 的svd替换opencv的svd结果发现点问题。记录一下防止忘了吧。

第一个例子 。row大于col 两组V结果是一致的。大小为5*5

      int row = 9;
        int col = 5;
        std::vector<std::vector<double>> vec{ 
        { 0.68f, 0.597f, 1 ,4,5},
        { -0.211f, 0.823f , 2, 0.68f, 0.597f},
        { 0.566f, -0.605f, 3, 0.68f, 0.597f},
        { 0.566f, -0.65f , 3, 0.68f, 0.597f},
        { 0.566f, -0.05f ,2, 0.68f, 0.597f},
        { 0.7566f, -0.705f ,1, 0.68f, 0.597f},
        { 0.5f, -0.605f, 0, 0.68f, 0.597f },
        { 0.156f, -0.405f, 4 , 0.68f, 0.597f},
        { 0.25f, -0.305f, 3, 0.68f, 0.597f }
        };

        cv::Mat mat(row, col, CV_64FC1);
        for (int y = 0; y < row; ++y) {
            for (int x = 0; x < col; ++x) {
                mat.at<double>(y, x) = vec.at(y).at(x);
            }
        }
        cv::Mat w, u, vt, v;
        cv::SVD::compute(mat, w, u, vt, 4);
        cout << "vt opecv = " << endl << vt.t() << endl;

    //    Mat EE = Mat(vt.t()).colRange(row, col) * 1.0;

    //    cout << "EE OPENCV = " << endl << EE << endl << endl;

        MatrixXd ddd = Eigen::MatrixXd::Zero(row, col);
        int cha = Q.channels();
        for (int i = 0; i < row; i++)
        {
            for (int j = 0; j < col; j++)
            {
                ddd(i, j) = mat.at<double>(i, j);
            }
        }

        JacobiSVD<MatrixXd> svd(ddd, ComputeThinU | ComputeThinV);
        MatrixXd U1, S1, V1;
        VectorXd vS = svd.singularValues();
        U1 = svd.matrixU();
        V1 = svd.matrixV();
        cout << "V1 eigen = " << endl << V1 << endl << endl;

 

输出:自己跑程序看一眼吧 不爱贴图了。

改为 row小于col 结果就有很大不同了。首先opencv的结果V是一个9*9的数组。eigen结果是9*5的数组

并且 opencv的V结果的转置的前5列就是eigen求得的V数组

int row = 5;
        int col = 9;
        std::vector<std::vector<double>> vec{ 
        { 0.68f, 0.597f, 1 ,4,5},
        { -0.211f, 0.823f , 2, 0.68f, 0.597f},
        { 0.566f, -0.605f, 3, 0.68f, 0.597f},
        { 0.566f, -0.65f , 3, 0.68f, 0.597f},
        { 0.566f, -0.05f ,2, 0.68f, 0.597f},
        { 0.7566f, -0.705f ,1, 0.68f, 0.597f},
        { 0.5f, -0.605f, 0, 0.68f, 0.597f },
        { 0.156f, -0.405f, 4 , 0.68f, 0.597f},
        { 0.25f, -0.305f, 3, 0.68f, 0.597f }
        };

        cv::Mat mat(row, col, CV_64FC1);
        for (int y = 0; y < row; ++y) {
            for (int x = 0; x < col; ++x) {
                mat.at<double>(y, x) = vec.at(x).at();
            }
        }
        cv::Mat w, u, vt, v;
        cv::SVD::compute(mat, w, u, vt, 4);
        cout << "vt opecv = " << endl << vt.t() << endl;

    //    Mat EE = Mat(vt.t()).colRange(row, col) * 1.0;

    //    cout << "EE OPENCV = " << endl << EE << endl << endl;

        MatrixXd ddd = Eigen::MatrixXd::Zero(row, col);
        int cha = Q.channels();
        for (int i = 0; i < row; i++)
        {
            for (int j = 0; j < col; j++)
            {
                ddd(i, j) = mat.at<double>(i, j);
            }
        }

        JacobiSVD<MatrixXd> svd(ddd, ComputeThinU | ComputeThinV);
        MatrixXd U1, S1, V1;
        VectorXd vS = svd.singularValues();
        U1 = svd.matrixU();
        V1 = svd.matrixV();
        cout << "V1 eigen = " << endl << V1 << endl << endl;

续:查到问题了 对eigen不熟悉啊 ComputeThinU这个值改改就好 改改   但是 转置是逃不掉得了.

再加一个:BDCSVD   eigen一共有两种svd分解方法。一个是JacobiSVD一个是BDCSVD  。用法类似。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: OpenCV是一款开源的计算机视觉库,它提供了丰富的图像处理和计算机视觉算法,可以帮助开发者实现各种视觉任务。CMake是一个跨平台的构建工具,可以帮助开发者在不同的操作系统上进行项目的构建和管理。Eigen是一个C++模板库,提供了高级的矩阵和向量运算功能,适用于各种数学计算和线性代数操作。 在使用OpenCV进行开发时,我们可以使用CMake进行项目的构建。CMake可以根据不同操作系统的情况生成相应的构建文件,方便开发者在不同系统上进行开发和部署。在构建OpenCV项目时,我们可以使用CMakeFile.txt文件来描述项目的结构和依赖关系,然后通过CMake生成对应的构建文件。 而Eigen可以与OpenCV一起使用,为OpenCV提供更强大的数学计算能力。Eigen提供了高性能的矩阵和向量操作,可以进行矩阵运算、特征值计算、线性代数等数学计算。通过集成Eigen,我们可以在OpenCV项目中更方便地处理各种数学计算任务。 在使用OpenCVEigen时,可以选择使用Visual Studio 2017进行开发。Visual Studio 2017是一款强大的集成开发环境,提供了丰富的开发工具和调试能力。通过Visual Studio 2017,我们可以方便地进行OpenCVEigen项目的编写、构建和调试,提高开发效率。 综上所述,OpenCV、CMake、Eigen和Visual Studio 2017可以相互配合使用,实现图像处理和计算机视觉相关的项目开发。通过使用CMake进行项目构建,集成Eigen库进行数学计算,使用Visual Studio 2017进行开发,可以提高开发效率,快速实现各种视觉任务。 ### 回答2: OpenCV 是一个开源的计算机视觉库,它提供了丰富的图像处理和计算机视觉算法。CMake 是一个跨平台的构建工具,用于生成编译项目所需的 Makefile 或者 Visual Studio 的解决方案文件。Eigen 是一个 C++ 模板库,提供了线性代数的相关功能。 在使用 OpenCV 进行开发时,我们可以使用 CMake 来配置和生成项目,以便在不同的开发环境中进行编译和构建。CMake 可以自动检测并配置 Opencv 的相关路径,以便正确地链接和使用库文件。 而 Eigen 则是一个非常常用的线性代数库,它提供了矩阵、向量和矢量等数学对象的定义和操作。在使用 OpenCV 进行图像处理时,我们经常需要使用到矩阵操作,而 Eigen 提供了更高效和方便的矩阵运算,可以更好地满足我们的需求。 对于在 Visual Studio 2017 上使用 OpenCV、CMake 和 Eigen 进行开发,我们首先需要确保已经正确安装并配置了这些工具。然后,我们可以使用 CMake 来生成一个 Visual Studio 的解决方案,其中将包含我们要开发的项目以及所需的库文件链接。 在 CMake 中,我们需要添加相应的路径信息,以便 CMake 可以找到 OpenCVEigen 的安装路径。然后将这些路径信息与我们的项目相关内容一起配置,并生成 Visual Studio 的解决方案。 在 Visual Studio 2017 中,我们可以打开生成的解决方案,并进行编写和调试我们的代码。可以使用 OpenCV、CMake 和 Eigen 的相关函数和类,进行图像处理、线性代数计算等任务。 总之,使用 OpenCV、CMake 和 Eigen 进行 Visual Studio 2017 上的开发,可以方便地进行图像处理和计算机视觉算法的开发,以及进行高效的线性代数计算。 ### 回答3: OpenCV是一个流行的计算机视觉库,用于处理图像和视频。依靠cmake进行项目构建。Eigen是一个C ++模板库,提供了用于线性代数运算的高性能数学工具。现在我来回答关于OpenCV、CMake和Eigen在VS2017中的问题。 首先,你需要确保已经在你的计算机上安装了Visual Studio 2017和CMake。在安装完成后,你可以开始设置OpenCV、CMake和Eigen。 首先,你需要下载并安装OpenCV库。你可以从OpenCV官方网站下载最新版本的OpenCV,并按照官方文档提供的说明进行安装。在安装完成后,你需要设置OpenCV的环境变量,以便在VS2017中使用OpenCV。 接下来,你可以使用CMake来构建你的OpenCV项目。在CMake中,你需要指定OpenCV的安装路径,并设置你的工程文件路径。你可以使用CMake的GUI界面或命令行界面来完成这一步骤。 然后,你需要下载并安装Eigen库。你可以从Eigen官方网站下载最新版本的Eigen,并按照官方文档提供的说明进行安装。 在设置完OpenCVEigen后,你可以在VS2017中创建一个新的项目。你需要在项目配置中链接OpenCVEigen库,并将必要的头文件包含到你的代码中。你可以在项目属性中进行这些配置。 最后,你可以在你的代码中使用OpenCV、CMake和Eigen来进行图像和视频处理、线性代数运算等操作。你可以通过查看OpenCVEigen和CMake的官方文档来学习更多关于这些库的用法和特性。 总结来说,你需要安装OpenCV、设置CMake并安装Eigen,然后在VS2017中配置你的项目,以使用OpenCV、CMake和Eigen来进行图像处理和数学运算。希望这些信息对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值