Проблема возникает из-за процесса ThresholdBinary
. Как я предполагаю, вы понимаете, этот метод вернет двоичное изображение, при этом все пиксели выше или равные параметру threshold
будут подтянуты до параметра maxValue
, а все пиксели ниже - до 0. Созданное изображение поэтому будет состоять только из двух значений (двоичных), 0
или maxValue
. Если мы последуем вашему примеру с некоторыми предполагаемыми значениями серого:
После Image<Gray, byte> image = receivedImage.Convert<Gray, byte>().ThresholdBinary(new Gray(80), new Gray(255));
вы получите:
Фактически, это изображение, которое вы передаете на CvInvoke.FindContours()
и впоследствии находите только самый крайний контур.
Что вам нужно , если вы действительно хотите продолжить с FindContours
, - это алгоритм, который будет "бин" или "пропускать" ваше изображение, чтобы сначала создать следующие сегменты, каждый из которых будет преобразован в двоичный, а контур будет обнаружен независимо.
Я чувствую, что ваш пример, вероятно, и чрезмерное упрощение проблемы, чтобы предложить вам решение на как вы могли бы добиться этого здесь. Однако, пожалуйста, задайте другой вопрос с более реалистичными c данными, и я буду рад предоставить несколько предложений.
В качестве альтернативы обратите внимание на более сложные методы обнаружения границ, такие как Canny или Sobel. Это видео может стать хорошей отправной точкой: Обнаружение краев