Обучайте пиксели кожи, используя Opencv CvNormalBayesClassifier

Я очень новичок в 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?

Большое спасибо.


person Wendy    schedule 06.11.2012    source источник


Ответы (2)


Вам нужно поместить в train_data значения пикселей из вашего тренировочного изображения, а в ответах индекс, соответствующий классу этого пикселя (например, 1 для класса кожи, 0 для класса не кожи). var_idx и sample_idx можно оставить как есть, они используются для маскировки некоторых дескрипторов или образцов в вашем обучающем наборе. Установите для обновления значение true/false в зависимости от того, получаете ли вы все дескрипторы (все пиксели всех ваших тренировочных изображений) одновременно, если вы можете установить значение false, или вы обрабатываете свои тренировочные изображения постепенно (что может быть лучше для проблем с памятью). ), и в этом случае вам необходимо обновить модель.

Позвольте мне пояснить вам код (не проверено и использует интерфейс С++ для OpenCV, который я настоятельно рекомендую вместо старого 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);

}

person remi    schedule 06.11.2012

Я выполнил поиск в Google по этому классу, но не нашел много информации, и на самом деле даже официальный документ opencv не дает прямого объяснения параметров. Но я заметил одну вещь в документе opencv

Метод обучает нормальный байесовский классификатор. Он следует соглашениям общего подхода CvStatModel::train() со следующими ограничениями:

которые направляют меня к классу CvStatModel, и оттуда я нашел кое-что полезно. И, возможно, вы также можете взглянуть на книгу со страницы 471, которая дает вам более подробную информацию об этом классе. Эта книга бесплатна для Google Книг.

person james    schedule 06.11.2012