繁体   English   中英

如何在OpenCV 2.4.2中使用CV :: EM类?

[英]How to use the CV::EM class in OpenCV 2.4.2?

在最新的OpenCV 2.4.2中遇到了有关如何使用EM算法的问题。 我曾经使用过C版本,并且运行良好,但是由于系统升级,似乎C API已在OpenCV 2.4.2中删除。

对于EM,这是一个简单的例子:假设我有一个半径列表,该半径被认为是来自两种球,并且我想估计这两种类型的均值/方差。 换句话说,这是一维问题。

我试图使用新的API编写EM的C ++版本,但尚未使它起作用。

int nsamples = radius_list.size();
int ncluster = 2;                 //we assume a bimodal model
Mat samples = Mat::zeros(nsamples, 1, CV_32FC1);

// init data
for (int i = 0; i < radius_list.size(); ++i) {
    int value = radius_list[i];
    samples.at<float>(i, 0) = value;
}
EM em_model = EM(ncluster, EM::COV_MAT_SPHERICAL);

if (!em_model.train(samples)) {
    cerr << "error training the EM model" << endl;
    exit(-1);
}

const Mat& means = em_model.get<Mat>("means");
int mean1 = means.at<float>(0, 0);
int mean2 = means.at<float>(1, 0);
cout << "mean1 = " << mean1 << ", mean2 = " << mean2 << endl;

const vector<Mat>& covs  = em_model.get<vector<Mat> >("covs");
int scale1 = covs[0].at<float>(0, 0);
int scale2 = covs[1].at<float>(0, 0);
cout << "scale1 = " << scale1 << ", scale2 = " << scale2 << endl;

问题是:尽管if()没有抱怨,但检索到的均值和小数位值是我机器上的垃圾值-2147483648。

请提供有关如何修改代码以使其起作用的建议。 我仍在学习OpenCV中的各种C ++ API。

谢谢你们!

您进行隐式类型转换会分散编译器的注意力。 均值,权重和协方差矩阵不是整数,而是双精度(您可以通过在屏幕上打印Mat.depth()结果来检查它),因此请更改所有行:

int mean1 = means.at<float>(0, 0);

像这样的代码:

double mean1 = means.at<double>(0, 0);

问候,拉法尔

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM