我尝试使用opencv的cv::calcCovarMatrix
来获得协方差矩阵,我创建了一个虚拟测试用例:
A = [1 2; 3 4] // matlab style
B = [1 0; 5 8]
如果我用matlab运行这个,我得到:
>> cov(A,B)
ans =
1.6667 4.3333
4.3333 13.6667
根据我的计算,这似乎是可以的,但当我使用cv::calcCovarMatrix
时,我无法获得相同的结果:
cv::Mat covar, mean;
cv::Mat A = (cv::Mat_<float>(2,2) << 1, 2, 3, 4);
cv::Mat B = (cv::Mat_<float>(2,2) << 1, 0, 5, 8);
cv::Mat x[2] = {A, B};
cv::calcCovarMatrix(x, 2, covar, mean, CV_COVAR_SCRAMBLED );
std::cout << covar << std::endl;
// gives [6, -6;
// -6, 6]
我错过了什么?
3条答案
按热度按时间kx1ctssn1#
两天前我遇到了同样的问题,我不知道为什么会出现这个问题,但我已经编写了一个代码,适用于我在OpenCV和MATLAB中测试的所有示例。
我测试了一些例子来证明这段代码可以正常工作(但是我不确定为什么它可以工作)
示例-1
在MATLAB中
在Opencv
输出
示例-2
MATLAB语言
开放式计算机虚拟化
示例-3
Matlab语言
开放式计算机虚拟化
cbeh67ev2#
只是缺少一个标志。请尝试:
COVAR_ROWS mean
:所有输入向量都存储为样本矩阵的行。(来自opencv 3.0 doc)7eumitmz3#
我使用了以下命令:
calcCovarMatrix(Z.t(), cov, mu, CV_COVAR_ROWS | CV_COVAR_SCRAMBLED |CV_COVAR_NORMAL);
在cov除以(nsamples-1)之后,该协方差与MATLAB计算结果相匹配。