4

私は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 として渡すことができる値を準備するには、現在の 2 つの画像ライブラリをどのように使用すればよいですか?

どうもありがとう。

4

2 に答える 2

4

トレーニング画像のピクセル値を train_data に入力し、応答としてこのピクセルのクラスに対応するインデックスを入力する必要があります (例: スキン クラスの場合は 1、非スキン クラスの場合は 0)。var_idx と sample_idx はそのままにしておくことができます。これらは、トレーニング セット内の記述子またはサンプルの一部をマスクするために使用されます。すべての記述子 (すべてのトレーニング画像のすべてのピクセル) を一度に取得するかどうかに応じて、更新を true/false に設定して、それを 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,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);

}

于 2012-11-06T22:27:15.333 に答える
0

このクラスで Google 検索を行いましたが、多くの情報が見つかりませんでした。実際、公式の opencv ドキュメントでさえ、パラメーターに関する直接的な説明を提供していません。しかし、opencv ドキュメントで 1 つのことに気付きました

このメソッドは、通常のベイズ分類器をトレーニングします。これは、一般的な CvStatModel::train() アプローチの規則に従いますが、次の制限があります。

これは CvStatModel クラスに私を導き、そこから何か役に立つものを見つけました。また、このクラスの詳細については、本の 471 ページを参照してください。この書籍は Google ブックスから無料です。

于 2012-11-06T16:31:09.770 に答える