Эффективное вычитание фона с помощью OpenCV - PullRequest
8 голосов
/ 08 января 2010

Я хочу сделать вычитание фона в видеофайле, используя метод OpenCV. Прямо сейчас я могу сделать вычитание фона, но проблема в том, что я не могу получить вывод в цветном режиме. Все выходные данные после вычитания фона поступают в режиме оттенков серого : (. Я хочу получить информацию о цвете на переднем плане, которая является результирующим выходным сигналом после вычитания фона.

Могу ли я сделать это в технике маскировки? как следующая процедура, о которой я думаю.

  1. Вход захвата - InputFrame (RGB)
  2. Процесс InputFrame
  3. Вычесть фон, сохранить передний план в TempFrame (который идет в оттенках серого : ()
  4. Создать маску, используя TempFrame
  5. Применить созданную маску к InputFrame
  6. Получить цвет переднего плана как OutFrame

Я поражен выполнением маскировки с использованием OpenCV. Я только начинающий в OpenCV. Пожалуйста, помогите мне преодолеть это.

Заранее спасибо.

Ответы [ 2 ]

21 голосов
/ 15 августа 2011

http://vimeo.com/27477093

код здесь

http://code.google.com/p/derin-deli-mavi/downloads/detail?name=denemeOpenCv23.zip&can=2&q=

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

// image.copyTo (передний план, передний план);

11 голосов
/ 17 января 2010

Хорошо, я не понимаю, как TempFrame (ваш передний план) может быть серого, если вы используете вычитание фона. Вы должны использовать очень специальный алгоритм. Но если предположить, что TempFrame имеет оттенки серого, то вы сделаете следующее:

cv::Mat mask = tempFrame > 0.5;

cv::Mat outFrame;
capturedFrame.copyTo(outFrame, mask);

Это код OpenCV 2.0 выше. Число 0,5 является порогом, вам нужно установить его на что-то подходящее. Если вы не используете изображения с плавающей точкой, вы, вероятно, установите его на 128 или что-то подобное. Это то же самое в коде OpenCV 1.1:

CvMat* mask = cvCreateMat(tempFrame.rows, tempFrame.cols, CV_8UC1);
cvCmpS(tempFrame, 0.5, mask);

CvMat* outFrame = cvCreateMat(capturedFrame.rows, capturedFrames.cols, CV_32FC3);
cvCopy(capturedFrame, outFrame, mask);
...