Обнаружение движения с помощью OpenCV Stack Overflow

Я пытаюсь играть с моей веб-камерой и OpenCV.
Я следую этому туто: http://mateuszstankiewicz.eu/?p=189.
Но единственный результат, который у меня есть, — это красная граница, и я не понимаю, почему. Может ли кто-нибудь помочь мне исправить это и исправить это?

Вот мой код:

#include "mvt_detection.h"

Mvt_detection::Mvt_detection()
{

}

Mvt_detection::~Mvt_detection()
{
}

cv::Mat Mvt_detection::start(cv::Mat frame)
{
cv::Mat back;
cv::Mat fore;
cv::BackgroundSubtractorMOG2 bg(5,3,true) ;
cv::namedWindow("Background");
std::vector<std::vector<cv::Point> > contours;

bg.operator ()(frame,fore);
bg.getBackgroundImage(back);
cv::erode(fore,fore,cv::Mat());
cv::dilate(fore,fore,cv::Mat());
cv::findContours(fore,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);
cv::drawContours(frame,contours,-1,cv::Scalar(0,0,255),2);
return frame;
}

Вот скриншот того, что возвращает наша камера:
введите описание изображения здесь

Я попробовал два других видео из там а также там и есть та же проблема.

Спасибо за помощь :).

0

Решение

Как сказал @Lenjyco, мы решаем проблему.

У @Micka была хорошая идея:

Во-первых, BackgroundSubtractorMOG2 должен создаваться только ОДИН РАЗ.

Мы создаем его в конструкторе и играем с Hystory и Threashold:

Mvt_detection::Mvt_detection()
{
bg = new cv::BackgroundSubtractorMOG2(10, 16, false);
}

10: номер изображения, которое фоновый рисунок оглядывается назад для сравнения.

16: пороговый уровень (размытие)

Таким образом, теперь мы можем обнаружить движение.

Спасибо !

0

Другие решения

Я использовал следующий код, который похож на ваш, и он работает хорошо. Я также принимаю входные данные с моей веб-камеры. В вашем коде я не нашел ни imshow (), ни waitkey. Попробуйте использовать их. Мой код следующий:

#include "opencv2/core/core.hpp"#include "opencv2/imgproc/imgproc.hpp"#include "opencv2/video/background_segm.hpp"#include "opencv2/highgui/highgui.hpp"#include <stdio.h>

#include <iostream>
#include <vector>

using namespace std;
using namespace cv;

int main()
{

VideoCapture cap;
bool update_bg_model = true;

cap.open(0);
cv::BackgroundSubtractorMOG2 bg;//(100, 3, 0.3, 5);
bg.set ("nmixtures", 3);
std::vector < std::vector < cv::Point > >contours;

cv::namedWindow ("Frame");
cv::namedWindow ("Background");

Mat frame, fgmask, fgimg, backgroundImage;

for(;;)
{
cap >> frame;
bg.operator()(frame, fgimg);
bg.getBackgroundImage (backgroundImage);
cv::erode (fgimg, fgimg, cv::Mat ());
cv::dilate (fgimg, fgimg, cv::Mat ());

cv::findContours (fgimg, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
cv::drawContours (frame, contours, -1, cv::Scalar (0, 0, 255), 2);

cv::imshow ("Frame", frame);
cv::imshow ("Background", backgroundImage);char k = (char)waitKey(30);
if( k == 27 ) break;

}

return 0;
}
0

Исправлена ​​проблема, помещая BackgroundSubtractorMOG2 в поле моего объекта и инициализируя его в конструкторе, чтобы он работал хорошо.

0
По вопросам рекламы [email protected]