2012-11-06 3 views
4

저는 OpenCV를 매우 새로 도입했습니다. CvNormalBayesClassifier를 사용하여 피부색 픽셀 색상을 학습하는 프로그램을 학습하려고합니다.Opencv CvNormalBayesClassifier를 사용하여 스킨 스킨 픽셀

현재 나는 다른 조명 조건과 배경에서 약 20 개의 인물 사진 (얼굴/다른 신체 부위)을 가지고 있습니다. 나는 또한 피부 부분이 빨간색으로 표시되고 나머지는 녹색으로 표시되는 20 개의 대응 응답을 받았습니다.

내가 _train_data 및 _responses로 전달 될 수있는 값을 준비하는

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

어떻게 내가 가지고 현재의 두 사진 라이브러리를 사용해야하는 함수를 사용하는 방법을 이해하는 문제가?

감사합니다.

답변

4

교육 이미지의 픽셀 값을 train_data에 입력하고 응답에서이 픽셀의 클래스에 해당하는 색인을 추가해야합니다 (예 : 클래스 스킨의 경우 1, 비 스킨의 경우 0). var_idx 및 sample_idx는 그대로 둘 수 있으며, 이들은 교육 세트의 일부 설명자 또는 샘플을 마스크 아웃하는 데 사용됩니다. 허위로 만들 수있는 경우에 대비하여 모든 설명자 (모든 교육 이미지의 모든 픽셀)를 한꺼번에 가져 오는 방법에 따라 업데이트를 참/거짓으로 설정하거나 교육 이미지를 점차적으로 처리합니다 (메모리 문제의 경우 더 좋을 수 있음).)이 경우 모델을 업데이트해야합니다.

나 코드 (체크, 내가 강하게 대신 기존 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); 

}

을 당신을 명확히하자
0

이 클래스에 대한 Google 검색을 수행했지만 많은 정보를 찾지 못했고 사실 공식 opencv 문서조차도 매개 변수에 대한 직접적인 설명을 제공하지 않습니다. 하지만 opencv 문서에 한 가지 주목했습니다.

이 방법은 Normal Bayes 분류자를 교육합니다.

CvStatModel 클래스에 저를 지시하고 거기에서 내가 유용 something을 발견 : 그것은 다음과 같은 제한과 일반 CvStatModel :: 기차() 방식의 규칙을 따릅니다. 아마도이 수업에 대한 자세한 내용을 제공하는 471 페이지의 책을 살펴볼 수도 있습니다. The book은 Google 도서에서 무료입니다.