使用Opencv CvNormalBayesClassifier训练皮肤像素

时间:2012-11-06 15:29:51

标签: c++ xcode opencv bayesian classification

我是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传入的值?

非常感谢。

2 个答案:

答案 0 :(得分:4)

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

让我用代码澄清你(没有检查,并使用我强烈推荐的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);

}

答案 1 :(得分:0)

我在这个类上进行了谷歌搜索,但没有找到太多信息,实际上甚至官方的opencv文档都没有提供有关参数的直接解释。但我确实在opencv文件中注意到了一件事

  

该方法训练Normal Bayes分类器。它遵循   通用CvStatModel :: train()方法的约定   以下限制:

将我引导到CvStatModel类,从那里我发现something很有用。也许你也可以看一下第471页的书,它为你提供了这个课程的更多细节。谷歌图书免费The book