gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:20:03 31 4
gpt4 key购买 nike

有一个关于如何在最新的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。

谢谢大家!

最佳答案

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

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

喜欢代码:

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

问候,拉法尔

关于opencv - 如何在 OpenCV 2.4.2 中使用 CV::EM 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11371737/

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