gpt4 book ai didi

python - OpenCV CalcCovarMatrix 与 Numpy Cov

转载 作者:行者123 更新时间:2023-11-28 05:36:45 25 4
gpt4 key购买 nike

我正在将图像处理算法从 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com