我尝试使用OpenCV的EM算法来实现GMM。一切都很好,除了在模型训练后我无法访问协方差矩阵。尝试访问它们总是会导致访问冲突。我使用C++ API,因为C API在文档中被标记为不推荐使用。
首先,我使用了OpenCV版本2.4.9。在OpenCV中实现一个通用建模模型非常简单:
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.0Beta并再次尝试(界面在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中有一个持续不断的bug?在这两种情况下,我都确信模型经过了良好的训练,并且概率值和均值是正确的。因此,我希望协方差矩阵也是正确的,但我无法访问它们。在我切换回一个较旧的版本和C API之前,它似乎在某一时刻起作用
我犯了什么错?
发布于 2015-03-21 21:01:26
尝试这样做:gmm.getMatVector(“cov”)i,其中i是集群。
https://stackoverflow.com/questions/28318920
复制相似问题