python - cv2.solve 无法返回最小二乘解
问题描述
我想用来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 分解来求解线性系统(这是 flags 参数的默认值)。但 LU 分解仅用于方阵,不适用于您的情况(线性系统超定)。DECOMP_SVD
,DECOMP_QR
和/或DECOMP_NORMAL
更适合您的情况。
推荐阅读
- javascript - 如何以角度将表单数据从一个组件保存到另一个组件?
- python - 使用python将statsmodel表转换为乳胶样式.png
- lotus-notes - Lotus Notes:从共享文件夹文本文件中获取信息并自动存储在 Lotus Notes 数据库中
- reactjs - React Native - 如何优化 FlatList 的 item 的渲染,或者对 extraData 进行非浅比较?
- asp.net-core - 为什么 Quartz.net 正在关闭,尽管 RepeatForever()
- javascript - 在 Vue.js 函数之外使用 Google Geocode 结果
- python - 有没有一种方法可以根据标签对列表中的相同元素进行分组?
- reactjs - 获取 401 授权问题
- excel - 在 Excel 加载项中重新加载自定义函数 - 在线版
- python - Python - 从子模块中的类继承