我尝试使用 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 之前,它在某些时候似乎有效
我犯了什么错误?
最佳答案
尝试做这样的事情 gmm.getMatVector("covs")[i],其中 i 是簇。
关于c++ - 如何在 OpenCV 的 EM 算法中检索协方差矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28318920/