Определение объекта на изображении и его размеров - Delphi

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Dr.Jekill, 10 Nov 2009.

  1. Dr.Jekill

    Dr.Jekill New Member

    Joined:
    4 Nov 2009
    Messages:
    13
    Likes Received:
    0
    Reputations:
    0
    Задача следующая:
    - есть последовательность снимков с камеры;
    - необходимо определить на кадре наличие объекта;
    - построить минимальный прямоугольник, описывающий объект;
    - определить площадь объекта;
    - сравнить с площадью прямоугольника с предыдущего кадра.
    Важный момент: фон динамический, поэтому отбросить его с помощью разницы кадров не получится.
    Делаю следующее:
    - строю гистограммы бинарного изображения (первая: f(x,кол-во черных точек), вторая: f(кол-во черных точек, y));
    - нахожу минимумы гистограмм (резкие скачки);
    - сопоставляю их и нахожу общие точки;
    - строю по полученным точкам прямоугольник;
    - нахожу длины двух его сторон (расстоние между двумя точками);
    - определяю площадь прямоугольника;
    - нахожу разность между площадью данного и площадью прямоугольника с предыдущего кадра.
    Проблема следующая: алгоритм не работает, если цвет объекта близок к цвету фона.
    В принципе подойдет любой алгоритм, позволящий определить объект, его размер и сравнить его с размером с предыдущего кадра.
    Модет кто-то работал с подобным? Буду благодарен за любую информацию.
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,704
    Likes Received:
    1,224
    Reputations:
    455
    Если ты воспользовался бы поиском то нашел бы тему которую тут уже обсуждали и там как раз был вопрос по поводу того, как выделить цветом изменившуюся часть изображения. И были ссылки на сайты где об этом говорится. А также примеры реализации данной вещи с помошью какойто библиотеки
     
    1 person likes this.
  3. Dr.Jekill

    Dr.Jekill New Member

    Joined:
    4 Nov 2009
    Messages:
    13
    Likes Received:
    0
    Reputations:
    0
    Распознование

    slesh, если Вы думаете, что я не пользовался поиском, Вы глубоко заблуждаетесь. Я просмотрел огромную кучу сайтов, перерыл очень много информации, в том числе и упоминаемую Вами тему. Занимаюсь этим не первый день и даже не второй.
    "там как раз был вопрос по поводу того, как выделить цветом изменившуюся часть изображения" - если Вы внимательно прочитали мой пост, то должны были заметить, что фон изменяется и вычитание фона в данном случае не применимо. Рассматриваемые там алгоритмы используются в случаях, когда камера статична.
    Использование библиотек компьютерного зрения, типа IPL, Open CV запрещенно.
    ВОПРОС ОСТАЕТСЯ АКТУАЛЬНЫМ!
     
  4. iama

    iama New Member

    Joined:
    6 Aug 2009
    Messages:
    11
    Likes Received:
    2
    Reputations:
    0
    ха-ха, вы случайно не фрилансер? я написал такой проект, только заказчик меня кинул, проект могу продать не меньше чем за 200 WMZ
     
  5. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,704
    Likes Received:
    1,224
    Reputations:
    455
    На такой случай как вариант можно строить промежуточный битмап.
    т.е. вычислить средний показатель яркости/цвета всего изображения. А затем всё что ниже - занизить сильнее, а всё что выше - завысить. В итоге получается что если фон тёмный, а объект чуть чуть светлее, то он фон затемнит чуть, а объект осветлит. И на основе такого битмапа уже проще будет сравнивать разницу в яркости/цвете

    т.е. действовать по аналогии с фотошоповской настройкой уровней (ctrl + L) - темное затемнить, а яркое осветлить.
     
  6. Dr.Jekill

    Dr.Jekill New Member

    Joined:
    4 Nov 2009
    Messages:
    13
    Likes Received:
    0
    Reputations:
    0
    Хорошее предложение

    slesh, дельное предложение. Попробую.
     
  7. Dr.Jekill

    Dr.Jekill New Member

    Joined:
    4 Nov 2009
    Messages:
    13
    Likes Received:
    0
    Reputations:
    0
    Цветовое RGB-пространство рассматривается как трехмерный куб, каждая ось которого соответствует одному из трех основных цветов (красному, зеленому или синему), деления на осях пронумерованы от 0 до 255 (большее значение соответствует большей интенсивности цвета). При таком рассмотрении любой цвет RGB-изображения может быть представлен точкой куба.
    Каждый однородно окрашенный объект проецируется в RGB-куб как точечный кластер или кластер в форме отрезка кривой с преимущественной ориентацией вдоль оси яркости.
    Необходимо находить в цветовом пространстве кластеры типа криволинейных отрезков:
    1. разбиение цветового пространства на слои семейством плоскостей, нормальных к главной диагонали цветового пространства;
    2. послойная кластеризация с помощью алгоритма поиска водоразделов;
    3. сборка кластеров;
    4. обратное проецирование на плоскость изображения с целью получения карты сегментации.
    Нужно использовать разбиение изображения на небольшие, плотно покрывающие изображение, прямоугольные области, каждая из которых сегментируется независимо. При этом при сегментации текущей области анализируется цветовое распределение, взятое по большей области. При этом объект, далёкий от текущей области, уже не зашумляет её локальное цветовое распределение, а близкие объекты вносят существенный вклад, даже если их вклад по площади в сегментируемую область мал. Для устранения границ между «областями внимания» используется процедура слияния областей с помощью ГСО. Функция для меры несходства определенна.

    Всё это используется, чтобы выделить на изображении однородно окрашенные объекты. Для связи точек RGB-куба c реальными координатами пробовал описать следующее (пишу в Delphi 7):
    type Pixel=record
    x,y: integer;
    end;
    var KUB: array[0..255,0..255,0..255] of Pixel; Компиллятор ругается. Как описать нечто подобное?

    "1. разбиение цветового пространства на слои семейством плоскостей, нормальных к главной диагонали цветового пространства;", насколько я понимаю плоскости пересекают оси в точках одинаковой интенсивности. Однако с реализацией этого проблемы. Для визуализации можно использовать OpenGL. По сути это главный вопрос.
     
  8. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    Не слишком ли ты усложняешь? Зачем эти кубы? Зачем эти отрезки "с преимущественной ориентацией вдоль оси яркости"?
    И вообще, RGB не самое лучшее решение для подобных задач. Намного удобнее работать с HSL или YUV, и не нужно никаких "кубов"...
     
  9. Dr.Jekill

    Dr.Jekill New Member

    Joined:
    4 Nov 2009
    Messages:
    13
    Likes Received:
    0
    Reputations:
    0
    Сейчас думаю реализовать это всё через оптические потоки. Знаете как представить изображение в виде слоев с разным разрешением в форме пирамиды Гаусса или Лапласа?
     
Loading...