Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python OpenCV逆矩阵_Python_Opencv_Matrix - Fatal编程技术网

Python OpenCV逆矩阵

Python OpenCV逆矩阵,python,opencv,matrix,Python,Opencv,Matrix,不知何故,我使用numpy的linalg.inv和OpenCv的Mat::inv得到了不同的结果,例如给定一个矩阵s: [747.8561839552103, 359.9317804054358, 204.6165451419812, 241.7376332155144, 126.132733370211, 81.57610562583466; 359.9317804054358, 204.6165451419812, 140.4788277943211, 126.132733370211,

不知何故,我使用numpy的
linalg.inv
和OpenCv的
Mat::inv
得到了不同的结果,例如给定一个矩阵
s

[747.8561839552103, 359.9317804054358, 204.6165451419812, 241.7376332155144, 126.132733370211, 81.57610562583466;
  359.9317804054358, 204.6165451419812, 140.4788277943211, 126.132733370211, 80.55127348381332, 47.7506303038364;
  204.6165451419812, 140.4788277943211, 116.7472083846913, 80.55127348381332, 63.86033402962857, 35.56970826526131;
  241.7376332155144, 126.132733370211, 80.55127348381332, 81.57610562583466, 47.7506303038364, 29.55106507912703;
  126.132733370211, 80.55127348381332, 63.86033402962857, 47.7506303038364, 35.56970826526131, 20.31193086803655;
  81.57610562583466, 47.7506303038364, 35.56970826526131, 29.55106507912703, 20.31193086803655, 12]
OpenCV
S.inv()
导致

[-19562262532715.65, 137.3094415699439, -44015090698406.93, 78249050130618.84, 88030181396160.73, -78249050129617.47;
 124.2797501878658, 19.14093204142484, 301.2737811201993, -531.0713785028685, -686.3332686269306, 655.5356524828615;
 -44015090698424.45, 330.6065529853437, -99033954070961.39, 176060362793110.9, 198067908140346.2, -176060362790691.7;
 78249050130642.06, -583.2397919514979, 176060362793093.2, -312996200521532.5, -352120725583424.9, 312996200517305.3;
 88030181396256.19, -744.9706630355842, 198067908140482.2, -352120725583702.1, -396135816277430.2, 352120725578288.9;
 -78249050129732.52, 707.7008280168318, -176060362790880.5, 312996200517672.6, 352120725578424.8, -312996200512573.6]
numpy的
linalg.inv
结果是:

[[2685109332201.37, -23.46, 6041495997420.42, -10740437328763.82, -12082991994731.51, 10740437328597.41]
 [-32.56, 19.14, -51.60, 96.23, 19.43, 28.24]
 [6041495997407.60, -31.13, 13593365994129.85, -24165983989574.97, -27186731988120.73, 24165983989366.80]
 [-10740437328747.65, 59.84, -24165983989589.86, 42961749314884.59, 48331967978891.43, -42961749314440.71]
 [-12082991994663.29, -21.50, -27186731988024.93, 48331967978691.32, 54373463976152.90, -48331967978849.60]
 [10740437328516.33, 64.62, 24165983989235.66, -42961749314181.06, -48331967978757.62, 42961749314608.99]]
好的,现在我来详细介绍一下我是如何偶然发现这个的: 我正在做一个常规的工作来拟合给定点集的椭圆;我已将代码从:转移到C++:

代码在初始化以下几点时运行:

TEST(fit_ellipse, test_example) {
    namespace bmc = boost::math::constants;

    typedef std::array<double, 2> point_type;
    std::vector<point_type> points;

    auto arc = .8;
    for (size_t i(0); i < 12; ++i) {
        auto r = i * arc * bmc::pi<double>() / 12;
        points.push_back({1.5 * std::cos(r) + 2, std::sin(r) + 1});
    }
    auto a = fit_ellipse(points.begin(), points.end());
    std::cout << "Parameters: "
    for (auto &p : a)
        std::cout << p << ' ';
    std::cout << std::endl;
}

你知道我遗漏了什么吗?

你知道OpenCV已经有了(这是Fitzgibbon方法的改进)?我想到直接使用二次曲线参数来确定拟合优度,想使用ransac来消除异常值。好的。我认为不同的结果是由于数值问题,在两种实现中处理方式不同。事实上,在Matlab中,结果与两者不同。问题似乎在于矩阵是病态的。Matlab给出的条件数为4.6471e+17,当一个条件良好的矩阵的条件数约为1时,尝试向对角线添加一个小值(如10e-5),结果应该更相似哦,是的,这可能会有帮助,谢谢,我将尝试这个。
import numpy as np
from numpy.linalg import eig, inv

def fitEllipse(x,y):
    x = x[:,np.newaxis]
    y = y[:,np.newaxis]
    D =  np.hstack((x*x, x*y, y*y, x, y, np.ones_like(x)))
    S = np.dot(D.T,D)
    C = np.zeros([6,6])
    C[0,2] = C[2,0] = 2; C[1,1] = -1
    Sinv = inv(S)
    print("Sinv: %s" % Sinv)
    E, V = eig(np.dot(Sinv, C))
    n = np.argmax(np.abs(E))
    a = V[:,n]
    return a
TEST(fit_ellipse, test_example) {
    namespace bmc = boost::math::constants;

    typedef std::array<double, 2> point_type;
    std::vector<point_type> points;

    auto arc = .8;
    for (size_t i(0); i < 12; ++i) {
        auto r = i * arc * bmc::pi<double>() / 12;
        points.push_back({1.5 * std::cos(r) + 2, std::sin(r) + 1});
    }
    auto a = fit_ellipse(points.begin(), points.end());
    std::cout << "Parameters: "
    for (auto &p : a)
        std::cout << p << ' ';
    std::cout << std::endl;
}
R = np.arange(0, arc * np.pi, arc * np.pi / 12)
x = 1.5 * np.cos(R) + 2
y = np.sin(R) + 1.
print("Parameters: %s" % fitEllipse(x,y))