python - OpenCV CalcCovarMatrix 与 Numpy Cov

标签 python c++ opencv numpy

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

相关文章:

python - Pyramid :删除重复的相似路线

python - 使用 Pandas DataFrames 进行 KMeans 聚类的数据结构

c++ - OpenCV C++ 中的 createBackgroundSubtractorKNN 参数是什么?

python - 在python中将列表的列表写入csv

c++ - 如何用gcc创建和使用自定义共享库?

c++ - C++11 是否允许在标识符中使用美元符号?

c++ - 简化嵌入式系统中的位(引脚)操作

image-processing - 如何从直方图中获取阈值?

OpenCV 2.4.3 和 videoInput 到 Mat

python - csv 列中的连字符/未知数据导致 int 转换错误