Mio 0 Жалоба Опубликовано June 3, 2012 Я просмотрел форум, поюзал поиск, но ничего не нашел. Наверное плохо искал, ибо вопрос тривиальный. Мне надо на бинаризированном изображении найти все 8-мисвязные объекты. Еще интересует какие будут свойства у найденных объектов. Я до этого решал эту задачу без OpenCV на MFC перебором всех пикселей. Работает не очень быстро. Я надеюсь, что в OpenCV эта задача решается быстрее. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Pavia00 32 Жалоба Опубликовано June 3, 2012 http://opencv.willowgarage.com/wiki/cvBlobsLib В результате будет набор контуров. С ними можно делать то что вы хотите. К примеру подсчитать моменты. Я до этого решал эту задачу без OpenCV на MFC перебором всех пикселей. Работает не очень быстро. Не очень быстро это количественно как? Сколько примерно времени на 1 пиксель? 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Mio 0 Жалоба Опубликовано June 3, 2012 http://opencv.willowgarage.com/wiki/cvBlobsLib В результате будет набор контуров. С ними можно делать то что вы хотите. К примеру подсчитать моменты. Поиск контуров более емкая задача, чем просто найти залитые области. Зачем мне лишняя нагрузка... Не очень быстро это количественно как? Сколько примерно времени на 1 пиксель? Ну это я не считал. Время значительно увеличивается от увеличения числа объектов. Так 3000 объектов находятся примерно за 1-2 секунды. Я считаю, что это долго, с учетом того, что это всего лишь начало работы. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Pavia00 32 Жалоба Опубликовано June 3, 2012 Поиск контуров сводит задачу к линейной. Оно не увеличивает сложность, а напротив уменьшает. 1-2 секунды это много. Мой собственный код выдаёт 0.140 секунд и я считаю что это медленно. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Mio 0 Жалоба Опубликовано June 3, 2012 1-2 секунды это много. Мой собственный код выдаёт 0.140 секунд и я считаю что это медленно. Я не профессионал в программировании. С алгоритмами не знаком, поэтому решаю задачи в лоб. Поэтому надеюсь на то, что в таких продуктах, как OpenCV мои задачи решены более оптимально хитроумными математическими приемами, которые мне не под силу. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Mio 0 Жалоба Опубликовано June 3, 2012 http://opencv.willowgarage.com/wiki/cvBlobsLib Спасибо за совет. Буду разбираться с cvBlobsLib. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано June 4, 2012 В OpenCV почему-то этого нет. Я реализовывал самостоятельно итеративный алгоритм. Работает быстро, не жалуюсь (но выложить исходники не могу). Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано June 4, 2012 http://en.wikipedia.org/wiki/Connected-component_labeling вроде уже было на форуме. вообще через контуры удобно тем ,что менше информации хранится + можно по периметру отсекать. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано June 4, 2012 Готовый код на OpenCV: http://nghiaho.com/?p=1102 http://code.opencv.org/attachments/467/opencv-connectedcomponents.patch Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано July 30, 2012 Готовая быстрая функция для нахождения связных компонент. 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] Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Pavia00 32 Жалоба Опубликовано July 30, 2012 Готовая быстрая функция для нахождения связных компонент. А насколько быстрая? Интересует Лена бинаризованная. Результат число тактов затраченных на 1 пискель. С трудом оптимизируется. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано July 30, 2012 Вроде ускорение около 10 раз (видел диаграммы, но не помню источник), в сравнении со способом через контуры. Можно засечь. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах