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

Решение

Вам необходимо ввести в 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);

}

4

Другие решения

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

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

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

0