python - cv2.solve无法返回最小二乘解

标签 python opencv linear-algebra

我想使用cv2.solve求解线性矩阵方程a * X = b。
输入矩阵的类型为float32,a的形状为(10,4),b的形状为(10,1)。
使用numpy我得到正确的输出:

x, _, _, _ = np.linalg.lstsq(a, b, rcond=-1)
print(x)

[[ 0.81440514]
 [ 0.08010263]
 [46.14513   ]
 [58.802303  ]]
当尝试使用opencv进行相同操作时,出现错误,我无法理解:
x = cv2.solve(a, b)

Traceback (most recent call last):
  File "/Users/yossib/.pyenv/versions/3.6.9/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 3331, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-22-611d9131dc5c>", line 1, in <module>
    cv2.solve(a, b)
cv2.error: OpenCV(4.2.0) /Users/travis/build/skvark/opencv-python/opencv/modules/core/src/lapack.cpp:1093: error: (-215:Assertion failed) (method != DECOMP_LU && method != DECOMP_CHOLESKY) || is_normal || src.rows == src.cols in function 'solve'

最佳答案

cv2.solve中添加一个明确的解决方案方法参数,例如:

x = cv2.solve(a, b, flags=cv2.DECOMP_QR)
默认情况下,opencv使用LU分解来求解线性系统(that's the default value of flags argument)。
但是LU分解仅用于平方矩阵,不适用于您的情况(线性系统被超定)。 DECOMP_SVDDECOMP_QR和/或DECOMP_NORMAL更适合您的情况。

关于python - cv2.solve无法返回最小二乘解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62622101/

相关文章:

opencv - 如何处理对象检测的遮挡、扭曲或透视变形?

c++ - 如何在 C++ 中计算列随机矩阵的特征向量

c++ - 在 OpenCV Mat 图像中显示 Vec3b 像素值

c++ - CV::Mat.release()

python - 对于给定的稀疏矩阵,如何将其与给定的二进制值向量相乘

c++ - 使用 PartialPivLU 进行 LU 分解

python - feincms 应用程序内容不适用于 feincms_translatedpage_or_base

python - 轨迹总长度

python - numpy:在二维数组中找到对称值

python - 我如何在django中没有任何 View 的情况下调用html模板