トレーニング画像のピクセル値を 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);
}