Оптимизация алгоритма сегментации путем вычитания изображения - PullRequest
8 голосов
/ 09 апреля 2011

для проекта в OpenCV Я хотел бы сегментировать движущиеся объекты настолько хорошо, насколько это возможно, с минимальным шумом.

Для этого я хотел бы использовать вычитание изображения алгоритм.У меня уже есть работающая программа, но сегодня я не нашел способа получить достаточно справедливые результаты.

У меня уже есть следующие (оттенки серого) изображения:

IplImage* grayScale;
IplImage* lastFrame;
IplImage* secondLastFrame;
IplImage* thirdLastFrame;

Пока у меня естьпопытался вычесть текущее изображение кадра и последний кадр с помощью cvSub(); или cvAbsDiff();, чтобы получить движущиеся части.

Но, к сожалению, я все еще получаю много шума там (т.е. из-за слегка движущихся деревьев, когдаветрено) и если движущийся объект довольно большой и имеет однородный цвет (скажем, человек в белой или черной рубашке), вычитание обнаруживает только изменения в изображении на левой и правой стороне человека, а не насамо тело, поэтому один объект иногда определяется как два объекта ...

cvAbsDiff(this->lastFrame,grayScale,output);
cvThreshold(output,output,10,250, CV_THRESH_BINARY);
cvErode(output,output, NULL, 2);
cvDilate(output,output, NULL, 2);

Чтобы избавиться от этого шума, я пытался размывать и расширять изображения с помощью cvErode() и cvDilate(), но это довольномедленный, и если движущиеся объекты на экране маленькие, эрозия почти полностью удаляет большую часть объекта, поэтому после деления я не всегда получаю хороший результат или разбит на частивверх объектов.

После этого я делаю cvFindContours(), чтобы получить контуры, проверить размер и, если он подходит, нарисовать прямоугольник вокруг движущихся объектов.Но результаты плохие, потому что часто объект разбивается на несколько прямоугольников из-за плохой сегментации.

Мой друг сказал мне, что я могу попробовать использовать более двух следующих кадров для вычитания, так как это может уже уменьшить шум.... но я действительно не знаю, что он имел в виду под этим и как я должен добавить / вычесть кадры, чтобы получить изображение, практически бесшумное и показывающее достаточно большие объектные пятна.

Может ли кто-нибудь помочь мне стот?Как я могу использовать более одного кадра, чтобы получить изображение с минимально возможным шумом, но с достаточно большими каплями для движущихся объектов?Я был бы благодарен за любые советы ...

ДОПОЛНЕНИЯ:

Я загрузил текущее видео прямо здесь: http://temp.tinytall.de/ Может быть, кто-то хочет попробоватьэто там ...

Это кадр из этого: на левом изображении показаны мои результаты cvFindContours (), а на правом - сегментированное изображение, на котором я затем пытаюсь найти контуры ...

segmentation result

Таким образом, один большой объект работает нормально, если он движется достаточно быстро ... то есть велосипед ... но на ходячих людях это не всегда дает хороший результат, хотя .... Есть идеи?

Ответы [ 3 ]

2 голосов
/ 11 апреля 2011

Кажется, у вас фиксированный фон. Одно из возможных решений - позволить компьютеру изучить фон, например. принимая в среднем за время. Затем рассчитайте разницу между средним изображением и текущим. Различия могут возникать от движущихся объектов.

2 голосов
/ 09 апреля 2011

При наличии трех смежных кадров A, B, C вы можете получить две разности кадров X и Y. Комбинируя X и Y (например, с помощью пороговой обработки и затем логической операции AND), вы можете уменьшить влияние шума. Нежелательный побочный эффект заключается в том, что область обнаружения движения будет немного меньше идеальной (операция AND приведет к уменьшению площади).

Поскольку оценка движения последовательности изображений хорошо изучалась в течение десятилетий, вы можете прочитать о более сложных методах обнаружения движения, например, работа с векторными полями движения. В этом случае Google Scholar - ваш друг.

1 голос
/ 09 апреля 2011

Ну, это очень рискованный предмет.Оценка движения довольно сложна.Поэтому постарайтесь найти хорошую литературу и избегайте изобретать алгоритмы:)

Мои предложения:

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

В конце концов, если вы хотите быть устойчивым, посмотрите на то, что известно как фильтр Калмана.Если вы отслеживаете объекты, вы не хотите, чтобы они совершали «бесконечные скачки скорости» между вашими кадрами (что обычно является шумом или пропуском).Это одна из библиотек C ++, я настоятельно рекомендую фильтр Калмана

Наконец, MonoSLAM, я немного подталкиваю :) Эндрю Дэвисон: Исследования

...