我看过链接的问题,但我无法理解为什么MATLAB和OpenCV会给出不同的结果。
MATLAB代码
double getColWiseStd(cv::Mat in)
{
CV_Assert( in.type() == CV_64F );
cv::Mat meanValue, stdValue, m2, std2;
cv::Mat colSTD(1, A.cols, CV_64F);
cv::Mat colMEAN(1, A.cols, CV_64F);
for (int i = 0; i < A.cols; i++)
{
cv::meanStdDev(A.col(i), meanValue, stdValue);
colSTD.at<double>(i) = stdValue.at<double>(0);
colMEAN.at<double>(i) = meanValue.at<double>(0);
}
std::cout<<"\nCOLstd:\n"<<colSTD<<std::endl;
cv::meanStdDev(colSTD, m2, std2);
std::cout<<"\nCOLstd_f:\n"<<std2<<std::endl;
return std2.at<double>(0,0);
}
使用OpenCV和此功能:
Matrix:
[6, 4, 23, -3;
9, -10, 4, 11;
2, 8, -5, 1]
COLstd:
[2.867441755680876, 7.71722460186015, 11.67142760000773, 5.887840577551898]
COLstd_f:
[3.187726614989861]
应用于相同的矩阵会产生以下结果:
std
我很确定OpenCV和MATLAB {{1}}函数是正确的,因此找不到我做错了什么,我错过了类型转换吗?还有别的吗?
答案 0 :(得分:1)
您在OpenCV中计算的标准偏差通过观察次数(io_related
)进行归一化,而您正在计算由N
归一化的MATLAB中的标准差(这也是默认的归一化因子) MATLAB,被称为 Bessel's correction )。因此存在差异。
您可以通过选择第二个输入参数N-1
在MATLAB中按N
进行标准化:
1