学习背景但仍然通过网络摄像头显示静态对象

时间:2015-11-04 11:23:40

标签: c++ opencv webcam

我正在开展一个大学项目,我们的桌子上有玻璃表面,网络摄像头和下面的红外线点。 我们想要检测某些手势,例如:

  • 1,2,3指
  • 3指尖

这是一只手通过相机的方式: Hand IR webcam image

当相机初始化时,它会学习背景并减去背景 Webcam background subtraction ini

到此: Hand on webcam background subtraction

然而,这手也是“学会了”#34;然后消失得很快 我们希望程序学习背景,但不会将手存储为背景的一部分,因为它将是静态的。

有关如何执行此操作的任何建议吗?

我们尝试过:玩学习率,模糊,形态。 代码包括在下面。

#include <opencv2/core/core.hpp>
#include "opencv2/opencv.hpp"
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/video/background_segm.hpp>
#include <opencv\cv.h>
#include <iostream>
#include <sstream>

using namespace cv;
using namespace std;

int main(int, char)
{
Mat frame; //current frame
Mat fgMaskMOG; //fg mask generated by MOG method
int frameNum = 0;
Ptr<BackgroundSubtractor> pMOG2; //MOG2 Background subtractor

//pMOG = new BackgroundSubtractorMOG(); //MOG approach
pMOG2 = createBackgroundSubtractorMOG2(20, 16, false); //MOG2 approach

VideoCapture cap(1); // open the default camera

if (!cap.isOpened()) // check if we succeeded
    return -1;

for (;;)
{
    cap >> frame; // get a new frame from camera
    if (!cap.read(frame)) {
        cerr << "Unable to read next frame." << endl;
        continue;
    }
    imshow("orig", frame);
    ++frameNum;
    pMOG2->apply(frame, fgMaskMOG, -1);

    imshow("frame", fgMaskMOG);

    if (waitKey(30) >= 0)
        break;
}
// the camera will be deinitialized automatically in VideoCapture destructor
return 0;

}

0 个答案:

没有答案