Обучаем пиксели скина с помощью 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?

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

4 голоса | спросил Wendy 6 22012vEurope/Moscow11bEurope/MoscowTue, 06 Nov 2012 19:29:50 +0400 2012, 19:29:50

2 ответа


0

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

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

}

ответил remi 7 32012vEurope/Moscow11bEurope/MoscowWed, 07 Nov 2012 02:27:15 +0400 2012, 02:27:15
0

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

  

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

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

ответил james 6 22012vEurope/Moscow11bEurope/MoscowTue, 06 Nov 2012 20:31:09 +0400 2012, 20:31:09

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132