c – 使用Opencv CvNormalBayesClassifier训练皮肤像素

前端之家收集整理的这篇文章主要介绍了c – 使用Opencv CvNormalBayesClassifier训练皮肤像素前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_502_0@
@H_502_0@
我对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传入的值?

非常感谢.

解决方法

您需要在训练图像中输入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); // 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,true);

}

@H_502_0@

猜你在找的Xcode相关文章