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

标签 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 之前,它在某些时候似乎有效

我犯了什么错误?

最佳答案

尝试做这样的事情 gmm.getMatVector("covs")[i],其中 i 是簇。

关于c++ - 如何在 OpenCV 的 EM 算法中检索协方差矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28318920/

相关文章:

c++ - 这里某处发生无限循环?

c++ - 将 char * 连接到字符串

python - 检测嘈杂的背景/物体 - OpenCV

c++ - 在此范围OpenCV.4中未声明cvSaveImage

android Opencv 基于 Float 而不是 Double

opencv - 使用图像处理的头发区域边界检测

C++抽象类问题

c++ - 从 const char * 或 LPCSTR 构建 std::string 时数据丢失

c++ - 链表字符串排序问题

c++ - 使用 openCv 的 Aruco 标记,获取 3d 角坐标?