如何在OpenCV的EM算法中检索协方差矩阵?

时间:2015-02-04 10:23:15

标签: c++ opencv

我尝试使用OpenCV的EM算法实现GMM。一切都运行得很好,除了在模型训练后我无法访问协方差矩阵。尝试访问它们总是会导致访问冲突。我使用C ++ API,因为C API在文档中被标记为已弃用。

首先我使用的是OpenCV版本2.4.9。在OpenCV中实现GMM模型非常简单:

EM model (3);
Mat probs;
bool b = model.train (samples, noArray(), noArray(), probs);
Mat means = model.get<Mat>("means");                  // --> correct values.
vector<Mat> sigmas = model.get<vector<Mat>>("covs");  // --> access violation.

由于过去我遇到过与其他OpenCV软件包类似的版本问题,我升级到OpenCV 3.0 Beta并再次尝试(界面在3.0中略有不同):

ml::EM::Params emps = ml::EM::Params::Params (3);
Mat probs;
Ptr<ml::EM> model = ml::EM::train (samples, noArray(), noArray(), probs, emps);
Mat means = model->getMeans();                      // same mean values, all correct
std::vector<Mat> sigmas;                            
model->getCovs (sigmas);                            // --> access violation

现在我很困惑。我是在做一些愚蠢的错误还是OpenCV中存在连续的错误?在这两种情况下,我都说服自己,模型训练有素,概率值和均值是正确的。所以我希望协方差矩阵也是正确的,但我无法设法访问它们。在我切换回旧版本和C API之前,它显然在某个时间工作

我犯了什么错误?

1 个答案:

答案 0 :(得分:0)

尝试做这样的事情 gmm.getMatVector(“covs”)[i],其中i是群集。