c++ - 使用不同样本多次调用 OpenCV trainEM 函数

标签 c++ opencv opencv3.0

对于说话人识别,我需要使用 GMM 算法,我选择了 OpenCV 库来实现。

我有一个 vector 成员变量 ml::EM 用于每个说话者:

std::vector< cv::Ptr<cv::ml::EM> > gMFCCVec;

我有一个方法可以简单地为给定的说话者调用 trainEM

void train(size_t speakerID, cv::Mat& samples)
{
    gMFCCVec[speakerID]->trainEM(samples);
} 

我的问题是我可以用不同的样本调用 trainEM 方法。我有 cv::Mat data1cv::Mat data2。如果我这样打电话:

 trainEM(data1);
 trainEM(data2);

ml::EM 将同时使用 data1data2 进行训练。或者最后一个的训练结果将覆盖第一个(在这种情况下 ml::EM 将仅使用 data2 进行训练)?

最佳答案

最后一个的训练结果将覆盖第一个。


你可以在implementation中看到trainEM 调用 setTrainData:

bool trainEM(InputArray samples,
           OutputArray logLikelihoods,
           OutputArray labels,
           OutputArray probs)
{
    Mat samplesMat = samples.getMat();
    setTrainData(START_AUTO_STEP, samplesMat, 0, 0, 0, 0);
    return doTrain(START_AUTO_STEP, logLikelihoods, labels, probs);
}

setTrainData 调用 clear():

void setTrainData(int startStep, const Mat& samples,
                  const Mat* probs0,
                  const Mat* means0,
                  const std::vector<Mat>* covs0,
                  const Mat* weights0)
{
    clear();
    ...

而那个clear只是清除之前训练好的数据:

void clear()
{
    trainSamples.release();
    ...

关于c++ - 使用不同样本多次调用 OpenCV trainEM 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34108938/

相关文章:

c++ - 私有(private)成员函数是否可以在 C++ 中同一类的访问函数内部调用

c++ - 将 Lab 值转换为 opencv 中的 RGB 值

macos - 在 Mac 10.12 (Sierra) 上安装 Caffe 时出错 "symbol(s) not found for architecture x86_64"

c++ - 使用多种语法和 phoenix::construct 的 boost:spirit::qi 解析器

c++ - 声明静态可变值的正确方法是什么

image-processing - 如何从图像中消除运动引起的失真

python - OpenCV python inRange 方法导致 C++ 模块出错

python - OpenCV 不附带 "external"库

python - cam.release() 后网络摄像头灯仍然亮着

c++ - 如何调试段错误?