在最新的OpenCV 2.4.2中有一个关于如何使用EM算法的问题.我曾经使用过C版本并且工作得很好,但是自从系统升级以来,似乎已经在OpenCV 2.4.2中删除了C API.
这是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;
Run Code Online (Sandbox Code Playgroud)
问题是:虽然if()没有抱怨,但检索到的平均值和比例值是我机器上的垃圾值-2147483648.
请告知如何修改代码以使其工作.我还在学习OpenCV中的各种C++ API.
谢谢你们!
你做的隐式类型转换会分散编译器的注意力.均值,权重和协方差矩阵不是整数但是加倍(您可以通过将Mat.depth()结果打印到屏幕来检查它)所以更改所有行:
int mean1 = means.at<float>(0, 0);
Run Code Online (Sandbox Code Playgroud)
像代码:
double mean1 = means.at<double>(0, 0);
Run Code Online (Sandbox Code Playgroud)
此致,拉法尔
| 归档时间: |
|
| 查看次数: |
3775 次 |
| 最近记录: |