Перво-наперво: это «порог», а не «три sh удержание». Это означает установить / применить порог, не удерживая три sh, что бы это ни значило.
То, что вы хотите, - это четкое обнаружение связанных компонентов вашего изображения. Если вы не хотите изучать основы обработки изображений c, сначала используйте функцию threshold()
. Тогда не используйте findContours()
/ drawContours()
, потому что они медленные. Если вам нужны разные подключенные компоненты, используйте connectedComponents()
: это быстро, и вы получаете разные метки для каждого компонента. Раскраска на ваше усмотрение, на основе индекса.
Вдохновленный Алексом Алекс Python ответ, здесь вы можете найти версию C ++:
#include <opencv2/opencv.hpp>
int main(void)
{
using namespace cv;
// Read image
Mat1b img = imread("input.png", IMREAD_GRAYSCALE);
// Make sure it's binary
threshold(img, img, 128, 255, THRESH_BINARY);
// Extract connected components
Mat1i labels;
int nlabels = connectedComponents(img, labels);
// Make the connected components from 0 to 255 (assume less than 256 labels)
img = labels * 255 / nlabels;
// Make the labels colored
Mat3b colored, output;
applyColorMap(img, colored, COLORMAP_JET);
// Mask background with zeros in original image
colored.copyTo(output, img);
// Write output
imwrite("output.png", output);
}
Единственное отличие состоит в том, что я указал тип изображений для присвоения img
также приведен к 8 bpp. И набранные Mat
гораздо приятнее в использовании.