예제 #1
0
MessageDataPtr Container::Recognize()
{
	Split();

	const TrainingWindowPtr training_window = MakeTrainingWindow(training_image_);
	const WorkingWindowPtr working_window = MakeWorkingWindow(working_image_);

	Encoder encoder;
	encoder.Prepare();

	unsigned recognize_slide_count = 0;
	while (training_window->Next() && working_window->Next())
	{
		training_window->CalculateProbabilities();

		unsigned iterations_count = training_window->PixelIterationsCount();
		for (unsigned iterations_counter = 0
			; iterations_counter != iterations_count
			; ++iterations_counter)
		{
			for (int i = 0; i != 3; ++i)
			{
				const int context = training_window->GetContext(iterations_counter, i);

				if (!training_window->IsValidContext(context, i))
				{
					continue;
				}

				const std::pair<double, double> probabilities =
						training_window->GetProbabilitiesByContext(context, i);

				const double probability0 = probabilities.first;
				const double probability1 = probabilities.second;

				encoder.StartModel(probability0, probability1);

				const unsigned char encoded_symbol = working_window->Read(iterations_counter, i);

				encoder.DecodeNext(encoded_symbol);
			}
		}

		++recognize_slide_count;
	}

	return encoder.RecognizedData();
}