2

最新の OpenCV 2.4.2 で EM アルゴリズムを使用する方法について質問があります。以前は C バージョンを使用していましたが、問題なく動作していましたが、システムのアップグレード以降、C API は OpenCV 2.4.2 で削除されたようです。

これは EM の単純なケースです。2 種類のボールからのものと見なされる半径のリストがあり、これら 2 種類の平均/分散を推定したいとします。つまり、これは 1 次元の問題です。

新しい 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 を学んでいます。

皆さん、ありがとうございました!

4

1 に答える 1

5

コンパイラの注意をそらす暗黙の型変換を行う。平均、重み、および共分散行列は int ではなく double です (Mat.depth() の結果を画面に出力することで確認できます)。すべての行を次のように変更します。

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

コードのように:

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

よろしく、ラファル

于 2012-11-19T11:51:30.930 に答える