加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 17:38:14 所属栏目:百科 来源:网络整理
导读:我对OpenCV很新.我正在尝试使用CvNormalBayesClassifier训练我的程序来学习皮肤像素颜色. 目前,我在不同的光线条件和背景下拍摄了大约20张人物照片(脸部/其他身体部位).我还有20个相应的响应,其中皮肤部分标记为红色,其他所有标记为绿色. 我有理解如何使用该
我对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);

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读