使用 Opencv CvNormalBayesClassifier 训练皮肤像素

Posted

技术标签:

【中文标题】使用 Opencv CvNormalBayesClassifier 训练皮肤像素【英文标题】:Train skin pixels using Opencv CvNormalBayesClassifier 【发布时间】:2012-10-26 14:16:41 【问题描述】:

我对 OpenCV 很陌生。我正在尝试使用 CvNormalBayesClassifier 来训练我的程序来学习皮肤像素颜色。

目前我有大约 20 张不同光线条件和背景下的人物照片(面部/其他身体部位)。我还收到了 20 个相应的回复,其中皮肤部分标记为红色,其他部分标记为绿色。

我无法理解如何使用该功能

bool CvNormalBayesClassifier::train(const CvMat* _train_data, const CvMat* _response, const Cv*Mat _var_idx = 0, const CvMat* _sample_idx=0,, bool update=false);

我应该如何使用我现有的两个图片库来准备可以作为_train_data和_responses传入的值?

非常感谢。

【问题讨论】:

【参考方案1】:

我在google上搜索了这个类,但没有找到太多信息,实际上即使是官方的opencv文档也没有提供关于参数的直接说明。但我确实注意到 opencv 文档中的一件事

该方法训练正态贝叶斯分类器。它遵循 通用 CvStatModel::train() 方法的约定与 以下限制:

它引导我进入 CvStatModel 类,从那里我发现 something 很有用。也许你也可以从第 471 页看这本书,它为你提供了这门课的更多细节。 The book 可从 Google 图书中免费获得。

【讨论】:

【参考方案2】:

您需要将训练图像中的像素值放入 train_data 中,并在响应中输入与该像素类别相对应的索引(例如,1 表示皮肤类,0 表示非皮肤类)。 var_idx 和 sample_idx 可以保持原样,它们用于屏蔽训练集中的一些描述符或样本。根据您是否一次获得所有描述符(所有训练图像的所有像素)将更新设置为真/假,以防您可以让它为假,或者您逐步处理训练图像(这可能更好地解决内存问题),在这种情况下,您需要更新模型。

让我用代码澄清一下(未检查,并使用我强烈推荐的 OpenCV 的 C++ 接口而不是旧的 C)

int main(int argc, char **argv)


  CvNormalBaseClassifier classifier;
  for (int i = 0; i < argc; ++i) 
    cv::Mat image = // read in your training image, say cv::imread(argv[i]);
    // read your mask image
    cv::Mat mask = ...
    cv::Mat response = mask == CV_RGB(255,0,0); // little trick: you said red pixels in your mask correspond to skin, so pixels in responses are set to 1 if corresponding pixel in mask is red, 0 otherwise.
    cv::Mat responseInt;
    response.convertTo(responsesInt, CV_32S); // train expects a matrix of integers

    image = image.reshape(0, image.rows*image.cols); // little trick number 2 convert your width x height, N channel image into a witdth*height row matrix by N columns, as each pixel should be considere as a training sample.
    responsesInt = responsesInt.reshape(0, image.rows*image.cols); // the same, image and responses have the same number of rows (w*h).

    classifier.train(image, responsesInt, 0, 0, true);

【讨论】:

以上是关于使用 Opencv CvNormalBayesClassifier 训练皮肤像素的主要内容,如果未能解决你的问题,请参考以下文章

opencv 安装 vc14可以在vs10上运行吗

OpenCV学习记录

我是不是需要使用 Gstreamer 构建 OpenCV 才能在 OpenCV 中使用 Gstreamer

opencv中自带的dll和lib 为啥不能直接使用?

OpenCV-IOS 在Xcode中使用时,除了把opencv2.framework拉入项目中,还需要做啥,

使用 opencv_contrib 在 Mac OS 终端中运行 OpenCV