OpenCV 3.0 Подключенные компоненты, не могу заставить его работать должным образом

У меня есть следующий код, это просто простая тестовая программа, чтобы узнать, как использовать функциональность подключенных компонентов в openCV 3.0

int main(int argc, char** argv) {

char* line = argv[1];

Mat image;

image = imread(line,CV_LOAD_IMAGE_GRAYSCALE);

cv::Mat label=Mat(image.size(),CV_16U);

int la=connectedComponents(image,label, 8,CV_16U);

//tried also: label.convertTo(label,CV_8U,255);
// and label.convertTo(label,CV_16U,255);

namedWindow( "input", CV_WINDOW_AUTOSIZE );
imshow( "input", image);

namedWindow( "ouput", CV_WINDOW_AUTOSIZE );
imshow("output", label);
cout<<la<<"\n";

imwrite("output.png", label);
waitKey(0);
return 0;
}

Входное изображение — это цветное изображение с двумя красными квадратами на белом фоне.
Изображение правильно загружено и отображается как изображение в градациях серого.
программа outoput

Дело не в том, что я делаю, на выходе всегда чистое изображение, черное или белое, в зависимости от convertTo . параметры при

Однако значение, возвращаемое connectedComponents это 2.

Я попробовал полный код, предложенный Мики, я получаю это:

введите описание изображения здесь

Я думал, что проблема может быть в том, что подключенные компоненты не работают должным образом.

Пробовал с картинкой у меня на рабочем столе и наконец-то получил:

введите описание изображения здесь

Однако на этот раз исходное изображение представляет собой обычную картинку с людьми, зданиями, автомобилями … и большая часть выходных данных остается пустой. Кто-нибудь знает почему?

После добавления image = image < 200;

введите описание изображения здесь

С applyColorMap(seeMyLabels, seeMyLabels, COLORMAP_JET);изображение меток переходит от почти черного оттенка серого к голубому

введите описание изображения здесь

3

Решение

Результаты есть, их просто не видно!


label содержит индекс каждой метки. Это означает, что в этом случае в метке у вас есть пиксель со значениями:

0 : background
1 : first connected component
2 : second connected component

так что ваше изображение довольно темное. Просто для наглядности вы можете добавить эту строку:

Mat seeMyLabels;
normalize(label, seeMyLabels, 0, 255, NORM_MINMAX, CV_8U);
imshow("Labels", seeMyLabels);

это будет масштабировать значения до видимого диапазона.

Обратите внимание, что изображение должно быть двоичным, с черным фоном и белым передним планом.

Полный код:

#include <opencv2\opencv.hpp>
using namespace cv;

int main(int argc, char** argv)
{
if (argc != 2) return -1;

Mat image = imread(argv[1], IMREAD_GRAYSCALE);

if (image.empty()) return -1;

Mat label;
int la = connectedComponents(image, label, 8, CV_16U);

Mat seeMyLabels;
normalize(label, seeMyLabels, 0, 255, NORM_MINMAX, CV_8U);

// You can apply a colormap for better visualization
//applyColorMap(seeMyLabels, seeMyLabels, COLORMAP_JET);

imshow("Labels", seeMyLabels);
imshow("input", image);
imshow("output", label);
waitKey(0);

return 0;
}
6

Другие решения

Других решений пока нет …