我正在将图像处理算法从 Python 移植到 C++,在这两种情况下都使用 OpenCV。
在 Python 版本中,我们使用 Numpy 中的 np.cov:
import numpy as np
#Using some dummy data to represent BGR pixels
values = [[30, 37, 35], [26, 36, 34], [38, 45, 41], [40, 47, 43], [38, 45, 43], [34, 43, 40], [30, 39, 37]]
result = np.cov(values, rowvar=False) #Using default 1/(N-1) normalisation
print result
产生输出:
[[ 27.23809524 22.23809524 18.66666667]
[ 22.23809524 18.9047619 15.83333333]
[ 18.66666667 15.83333333 13.66666667]]
在 C++ 版本中,我们使用 OpenCV 的 calcCovarMatrix:
#include <opencv2/core.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main() {
Mat values(7, 3, CV_8UC1);
//Representing the same pixels as the Python code
values.at<uchar>(0) = (30, 37, 35);
values.at<uchar>(1) = (26, 36, 34);
values.at<uchar>(2) = (38, 45, 41);
values.at<uchar>(3) = (40, 47, 43);
values.at<uchar>(4) = (38, 45, 43);
values.at<uchar>(5) = (34, 43, 40);
values.at<uchar>(6) = (30, 39, 37);
Mat avgs, covars;
calcCovarMatrix(values, covars, avgs, CV_COVAR_NORMAL | CV_COVAR_SCALE | CV_COVAR_ROWS);
cout << covars << "\n";
calcCovarMatrix(values, covars, avgs, CV_COVAR_NORMAL | CV_COVAR_ROWS);
cout << covars << "\n";
return 0;
}
产生输出:
[364.8163265306122, 253.4285714285715, 260.6122448979592;
253.4285714285715, 308.2857142857143, 317.5714285714286;
260.6122448979592, 317.5714285714286, 334.8163265306122]
[2553.714285714286, 1774, 1824.285714285714;
1774, 2158, 2223;
1824.285714285714, 2223, 2343.714285714285]
可以看出,C++ 输出与 Python 输出完全不匹配。在 calcCovarMatrix 中缩放或不缩放似乎并不能纠正它,在 np.cov 中设置 ddof 或不设置似乎也不能纠正它。有什么想法吗?
注意:无论出于何种原因,np.cov 和 calcCovarMatrix 使用对“行”的相互矛盾的解释;在这两种输入情况下,每个 行 代表一个观察值,每个 列 代表一个变量,因此在 Numpy 中我们设置 rowvar=False 但在 calcCovarMatrix 中我们设置 CV_COVAR_ROWS(为 True ).我不认为这是问题的根源。
最佳答案
罪魁祸首已经确定!有两个问题:
1) values.at<uchar>(0) = (30, 37, 35);
实际上并没有将值写入行(正如来自 Python 的人所期望的那样)。它实际上只是将最后一个值 35 写入 Mat 的第 0 个位置。上面代码中的 Mat 实际上解析为:
`[35, 34, 41;
43, 43, 40;
37, 0, 0;
0, 0, 0;
0, 0, 0;
0, 0, 0;
0, 0, 0]`
2) OpenCV CalcCovarMatrix 未标准化。 covars/(values.rows-1)
修复此问题并生成与 Python Numpy 相同的输出。
关于python - OpenCV CalcCovarMatrix 与 Numpy Cov,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38117383/