для проекта в 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 (), а на правом - сегментированное изображение, на котором я затем пытаюсь найти контуры ...
Таким образом, один большой объект работает нормально, если он движется достаточно быстро ... то есть велосипед ... но на ходячих людях это не всегда дает хороший результат, хотя .... Есть идеи?