kazanOpenCV 0 Жалоба Опубликовано February 1, 2013 Здравствуйте, уважаемые форумчане! Помогите, пожалуйста, разобраться или подсказать в каком направлении "копать". Есть некий объект (см. прикрепленную картинку) - фигура криволинейной формы с синим контуром, контур в произвольном случае может быть нечеткий. Вручную задается грубый контур, повторяющий форму объекта. В данном случае он замкнутый и состоит из 17 точек. Далее, используя грубый контур, нужно в автоматическом режиме получить уточненный контур, максимально повторяющий форму объекта. Заранее благодарен всем за любые советы и идеи. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано February 1, 2013 ну это надо гуглить насчёт intelligent scissors и всего в таком духе. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано February 1, 2013 Может змеи помогут? http://www.compvision.ru/forum/index.php?showtopic=443 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kazanOpenCV 0 Жалоба Опубликовано February 1, 2013 Спасибо за быстрый ответ. Буду изучать в указанных направлениях и отписываться в теме с идеями и вопросами, если никто не против Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kazanOpenCV 0 Жалоба Опубликовано February 6, 2013 а встроенные в OpenCV grabcut и watershed могут помочь? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано February 7, 2013 смотря какие у вас исходные данные при постановке задачи. вообще это алгоритмы для сегментации. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kazanOpenCV 0 Жалоба Опубликовано February 7, 2013 mrgloom, есть исходный кадр (например, как в первом посте, в котором есть какие-то объекты), задается грубый контур в виде набора точек (передается извне), также задается расстояние между точками уточненного контура, а также максимальное удаление точки уточненного контура от исходного грубого. Соответственно, нужно на выходе получить уточненный контур с требуемыми параметрами. Приблизительно так. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Victor Tsaregorodtsev 10 Жалоба Опубликовано February 10, 2013 kazanOpenCV был вроде такой алгоритм для задач трекинга объектов - но в полвторого ночи мой склероз отказывается вспоминать его название Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kazanOpenCV 0 Жалоба Опубликовано February 11, 2013 kazanOpenCV был вроде такой алгоритм для задач трекинга объектов - но в полвторого ночи мой склероз отказывается вспоминать его название Victor, я могу подождать светлого времени суток) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kazanOpenCV 0 Жалоба Опубликовано February 13, 2013 Всем доброго времени суток! Спасибо Smorodov и mrgloom за идеи. Smorodov, змеи предполагают замкнутый начальный контур? Если так то не совсем подходит. Продолжаю "копать" в этом направлении. Набросал алгоритм, прошу высказать идеи и замечания. Итак, есть исходная картинка (рис.1) Далее вручную (мышью) задается грубый ломаный контур (в общем случае незамкнутый) для определенного объекта на картинке (например, в нашем случае - часть верхнего контура антилопы).Рис.2. Задается максимальная удаленность (d1) от отрезка исходного грубого контура и точность (d2) - частота точек на уточненном контуре. Затем необходимо найти уточненный контур исходя из заданного грубого контура и критериев d1 и d2. Предполагается следующий алгоритм: 1) Ограничиваю область поиска прямоугольной областью, описывающую исходный грубый ломаный контур - minAreaRect. 2) перевод в градации серого 3) размытие (?) 4) adaptiveThreshold 5) FindContours 6) строим перпендикулярные прямые (в обе стороны на длину d1) на каждом отрезке исходного грубого контура (через расстояние d2) и ищем пересечение с найденными в п.5. контурами (?) - рис.3 Далее также по каждому отрезку. 7) Объединяем найденные точки в единый уточненный контур. В чем могут быть подводные камни и как лучше реализовать алгоритм? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано February 13, 2013 ну если судить по картинке, если вы задаёте приближенный контур ломаной, то надо к каждому отрезку найти нормаль(перпендикуляр) и наверно из каждой точки этого отрезка идти по этой нормали в 2 стороны(или внутрь замыкаемой области) точка останова там где у нас наибольший перепад яркости т.е. собственно граница. потом получили эти точки и можно их просто соединить, а можно например сгладить или еще как то проанализировать. Единственное, тут у нас изображение состоит из пикселей и надо нашу "векторную" линию как то на неё "положить", т.е. либо линия состоит тупо из пикселей(но их координаты как то всё равно надо получить, наверно можно посмотреть из кода опенцв там где рисуются линии) либо яркость точки на линии зависит от нескольких точек в окресности прохождения линии по какой либо более умной интерполяции. а лучше не велосипедить, а всё таки посмотреть как работают лассо, магические ножницы и т.д. например в гимпе http://docs.gimp.org/en/gimp-tool-iscissors.html Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kazanOpenCV 0 Жалоба Опубликовано February 13, 2013 mrgloom, а как средствами OpenCV определить перепад яркости двух точек? Перевести изображение в HSV и использовать значение V? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано February 13, 2013 не знаю может быть достаточно просто перевести в серый и найти производную по направлению нормали. как находить производную под углом на форуме вроде бы уже обсуждалось(легче всего просто повернуть изображение на угол и найти по прямой, даже не всё изображение, а участок в котором ищем и не надо будет заморачиваться с линией интерполяция от поворота изображения как бы сделает сама за нас всё) вот тут еще http://answers.opencv.org/question/387/sobel-derivatives-in-the-45-and-135-degree/ Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kazanOpenCV 0 Жалоба Опубликовано February 13, 2013 mrgloom, идея с поворотом на угол понравилась, но не совсем понял насчет заморочки с линией, можно поподробнее? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано February 13, 2013 Единственное, тут у нас изображение состоит из пикселей и надо нашу "векторную" линию как то на неё "положить", т.е. либо линия состоит тупо из пикселей(но их координаты как то всё равно надо получить, наверно можно посмотреть из кода опенцв там где рисуются линии) либо яркость точки на линии зависит от нескольких точек в окресности прохождения линии по какой либо более умной интерполяции. а если у нас изображение уже повернуто, то интерполяция пикселей как бы сделана и у нас просто прямая линия. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kazanOpenCV 0 Жалоба Опубликовано February 13, 2013 ок, теперь понятно) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано February 13, 2013 вот еще кстати (с кодом) https://facwiki.cs.byu.edu/cs312ringger/index.php/Project_4 тут путь в графе ищется, что то типа graphcut чтоли. 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kazanOpenCV 0 Жалоба Опубликовано February 14, 2013 "Спустился" до уровня отдельных пикселов. Как задать некую аггрегатную характеристику (учитывающую в общем случае яркость, цветность и т.п.) отдельного пикселя, чтобы сравнивать между их собой, проходя вдоль линии? Соответственно, найдя глобальный максимум на линии, можно предположить, что именно там и есть граница. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано February 14, 2013 граница это перепад. находите градиент собелем и находите максимум. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kazanOpenCV 0 Жалоба Опубликовано February 14, 2013 mrgloom, я уже замучил) запутался с Sobel, как правильно применить ее к моему случаю? Если я правильно понял, у нас есть матрица-столбец (фактически прямий отрезок состоящий из Grayscale точек [1..N]), как к ней применить Sobel? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано February 14, 2013 Вот презентация, которую я делал к лекции, надеюсь поможет разобраться с границами: Выделение границ.pdf 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано February 14, 2013 http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/sobel_derivatives/sobel_derivatives.html Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kazanOpenCV 0 Жалоба Опубликовано February 14, 2013 Вот презентация, которую я делал к лекции, надеюсь поможет разобраться с границами: Выделение границ.pdf Smorodov, спасибо. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kazanOpenCV 0 Жалоба Опубликовано February 14, 2013 http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/sobel_derivatives/sobel_derivatives.html mrgloom, спасибо за ощутимую помощь и внимание к теме. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kazanOpenCV 0 Жалоба Опубликовано February 16, 2013 Добрый день, на скриншоте результат - третье маленькое окно сверху с белым контуром. Белый контур - это попиксельно найденный c помощью Sobel. Есть проблема когда в фрагменте несколько ощутимызх перепадов яркости, как быть в этом случае? Нужно искать максимум по каким-то критериям. Вообщем застопорился. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах