Перейти к содержимому
Compvision.ru
Mio

Поиск связных компонент

Recommended Posts

Я просмотрел форум, поюзал поиск, но ничего не нашел. Наверное плохо искал, ибо вопрос тривиальный.

Мне надо на бинаризированном изображении найти все 8-мисвязные объекты. Еще интересует какие будут свойства у найденных объектов.

Я до этого решал эту задачу без OpenCV на MFC перебором всех пикселей. Работает не очень быстро. Я надеюсь, что в OpenCV эта задача решается быстрее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

http://opencv.willowgarage.com/wiki/cvBlobsLib

В результате будет набор контуров. С ними можно делать то что вы хотите. К примеру подсчитать моменты.

Я до этого решал эту задачу без OpenCV на MFC перебором всех пикселей. Работает не очень быстро.

Не очень быстро это количественно как? Сколько примерно времени на 1 пиксель?

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

http://opencv.willowgarage.com/wiki/cvBlobsLib

В результате будет набор контуров. С ними можно делать то что вы хотите. К примеру подсчитать моменты.

Поиск контуров более емкая задача, чем просто найти залитые области. Зачем мне лишняя нагрузка...

Не очень быстро это количественно как? Сколько примерно времени на 1 пиксель?

Ну это я не считал. Время значительно увеличивается от увеличения числа объектов.

Так 3000 объектов находятся примерно за 1-2 секунды. Я считаю, что это долго, с учетом того,

что это всего лишь начало работы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Поиск контуров сводит задачу к линейной. Оно не увеличивает сложность, а напротив уменьшает.

1-2 секунды это много. Мой собственный код выдаёт 0.140 секунд и я считаю что это медленно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

1-2 секунды это много. Мой собственный код выдаёт 0.140 секунд и я считаю что это медленно.

Я не профессионал в программировании. С алгоритмами не знаком, поэтому решаю задачи в лоб. Поэтому надеюсь на то, что в таких продуктах, как OpenCV мои задачи решены более оптимально хитроумными математическими приемами, которые мне не под силу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В OpenCV почему-то этого нет. Я реализовывал самостоятельно итеративный алгоритм. Работает быстро, не жалуюсь (но выложить исходники не могу).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

http://en.wikipedia.org/wiki/Connected-component_labeling

вроде уже было на форуме.

вообще через контуры удобно тем ,что менше информации хранится + можно по периметру отсекать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Готовая быстрая функция для нахождения связных компонент.

ConnectedcompsLabeling(Mat).zip

Способ употребления:

#include <iostream>
#include <vector>
#include <stdio.h>
#include <stdarg.h>
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "cvlabeling_imagelab.h"
#include "fstream"
#include "iostream"
using namespace std;
using namespace cv;

//-----------------------------------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------------------------------
int main( int argc, char** argv )
{
namedWindow("Res");
namedWindow("Labels");
Mat res=imread("C:\\ImagesForTest\\BWHoles.bmp",0);
Mat labels(res.rows,res.cols,CV_32SC1); // Здесь будут лежать метки
int n_labels;

cvLabelingImageLab (res, labels,0, &n_labels);
cout << cv::countNonZero(labels) << endl; // количество размеченных пикселей
labels.convertTo(labels,CV_8UC1,10.0); // это чтобы было видно на изображении
imshow("Labels",labels); // показваем метки
imshow("Res",res);
waitKey(0);
return 0;
}
[/code]

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Готовая быстрая функция для нахождения связных компонент.

А насколько быстрая? Интересует Лена бинаризованная. Результат число тактов затраченных на 1 пискель.

С трудом оптимизируется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вроде ускорение около 10 раз (видел диаграммы, но не помню источник), в сравнении со способом через контуры.

Можно засечь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×