OpenCV 和 Eigen求解线性方程 Ax=B

11 篇文章 5 订阅
2 篇文章 0 订阅
#include <iostream>

#include <Eigen/Core>
#include <Eigen/Eigen>
#include <Eigen/Geometry>

#include<opencv2/opencv.hpp>

int test_opencv()
{
    printf("\nSolve equation:AX=b\n\n");
    cv::Mat A = (cv::Mat_<float>(4, 3) <<
    2926.36, 2607.79, 1,
    587.093, 2616.89, 1,
    537.031, 250.311, 1,
    1160.53, 1265.21, 1);// 4x3

    cv::Mat B = (cv::Mat_<float>(4, 3) <<
    320.389, 208.197, 1,
    247.77, 209.726, 1,
    242.809, 283.182, 1,
    263.152, 253.715, 1);


    cv::Mat X;
    std::cout << "A=" << std::endl << A << std::endl;
    std::cout << "B=" << std::endl << B << std::endl;

    cv::solve(A, B, X, cv::DECOMP_SVD);

    std::cout << "X=" << std::endl << X << std::endl;
    cv::Mat a1 = (cv::Mat_<float>(1, 3) << 1864, 1273, 1);
    cv::Mat b1 = a1*X;
    std::cout << "b1=" << std::endl << b1 << std::endl;
    std::cout << "真实值为:" << "283.265, 253.049, 1" << std::endl;
    return 0;
}

void SVD()
{
    double _a[12] = {2926.36, 2607.79, 1,
                     587.093, 2616.89, 1,
                     537.031, 250.311, 1,
                     1160.53, 1265.21, 1};
    double _b[12] = {320.389, 208.197, 1,
                     247.77, 209.726, 1,
                     242.809, 283.182, 1,
                     263.152, 253.715, 1};
    auto A = Eigen::Map<Eigen::MatrixXd>(_a, 3, 4).transpose();
    auto B = Eigen::Map<Eigen::MatrixXd>(_b, 3, 4).transpose();
    std::cout<< "A=\n"<<A<<std::endl<<std::endl;
    std::cout<< "B=\n"<<B<<std::endl<<std::endl;
    const Eigen::JacobiSVD<Eigen::MatrixXd> svd(A, Eigen::ComputeThinU | Eigen::ComputeThinV);

    auto x = svd.solve(B);
    std::cout<< "x=\n"<<x<<std::endl;
}

int main()
{
    test_opencv();
    std::cout<<"==================================="<<std::endl;
    SVD();
    return 1;
}

输出:

Solve equation:AX=b

A=
[2926.3601, 2607.79, 1;
 587.09302, 2616.8899, 1;
 537.03101, 250.311, 1;
 1160.53, 1265.21, 1]
B=
[320.38901, 208.19701, 1;
 247.77, 209.726, 1;
 242.80901, 283.18201, 1;
 263.15201, 253.715, 1]
X=
[0.031037141, -0.00071162981, 4.425834e-11;
 0.0014961162, -0.031319518, -2.7852835e-11;
 225.57526, 292.40707, 1.0000001]
b1=
[285.33304, 251.21085, 1.0000001]
真实值为:83.265, 253.049, 1
===================================
A=
2926.36 2607.79       1
587.093 2616.89       1
537.031 250.311       1
1160.53 1265.21       1

B=
320.389 208.197       1
 247.77 209.726       1
242.809 283.182       1
263.152 253.715       1

x=
   0.0310371 -0.000711644  2.71051e-20
  0.00149613   -0.0313195  5.42101e-20
     225.575      292.407            1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值