Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在OpenCV 2.4.2中使用CV::EM类?_Opencv - Fatal编程技术网

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

如何在OpenCV 2.4.2中使用CV::EM类?,opencv,Opencv,有一个关于如何在最新的OpenCV 2.4.2中使用EM算法的问题。 我曾经使用C版本,它工作得非常好,但是自从系统升级之后,似乎C API已经在OpenCV 2.4.2中删除了 这是EM的一个简单例子:假设我有一个半径列表,它被认为来自两种球,我想估计这两种球的均值/方差。换句话说,这是一个一维问题 我试图用新API编写C++版本,但还没有工作。 int nsamples = radius_list.size(); int ncluster = 2; //we

有一个关于如何在最新的OpenCV 2.4.2中使用EM算法的问题。 我曾经使用C版本,它工作得非常好,但是自从系统升级之后,似乎C API已经在OpenCV 2.4.2中删除了

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

我试图用新API编写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;
int nsamples=radius_list.size();
int ncluster=2//我们假设一个双峰模型
Mat样本=Mat::零(nsamples,1,CV_32FC1);
//初始数据
对于(int i=0;icerr您正在进行隐式类型转换,这会分散编译器的注意力。平均值、权重和协方差矩阵不是整数,而是双精度矩阵(您可以通过将Mat.depth()结果打印到屏幕上进行检查),因此将所有行更改为:

int mean1 = means.at<float>(0, 0);
int-mean1=平均值(0,0);
希望代码:

double mean1 = means.at<double>(0, 0);
double means 1=平均值(0,0);
问候,,
Rafal的/P>C.API没有真正被移除。它现在位于OpenCvyLeaCyyExp升值安德烈中。经过一段时间的测试/运行,我把C API返回到代码中,它看起来工作正常。虽然我可以继续使用C API,但我也很想移至C++ API。对上面的代码有什么建议吗?我建议你去OpenCV sou。rce并研究旧API的实现。它是作为新
EM
类的包装器实现的。希望您能找到代码中缺少的详细信息。请检查,