我正在使用OpenCV243进行项目,我需要在流中获取前景,我的问题是我使用cv::absdiff来获取它并没有真正的帮助,这是我的代码和结果。

#include <iostream>
#include<opencv2\opencv.hpp>
#include<opencv2\calib3d\calib3d.hpp>
#include<opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>

int main (){
    cv::VideoCapture cap(0);
    cv::Mat frame,frame1,frame2;
    cap >> frame;
    frame.copyTo(frame1);
    cv::imwrite("background.jpeg",frame1);
    int key = 0;
    while(key!=27){
        cap >> frame;
        cv::absdiff(frame, frame1, frame2);  // frame2 = frame  -frame1
        cv::imshow("foreground", frame2);
        if(key=='c'){
            //frame.copyTo(frame2);
            cv::imwrite("foreground.jpeg", frame2);
            key = 0;
        }

        cv::imshow("frame",frame);
        key = cv::waitKey(10);
    }
    cap.release();
    return 0;
}

如您所见,减法工作有效,但是我想得到的只是值的变化,例如,如果背景中有一个像素为 [130,130,130] 的像素,而同一像素在我想要的帧中具有 [200,200,200] 获取确切的最后一个值,而不是 [70,70,70]
我已经看过本教程:http://mateuszstankiewicz.eu/?p=189
但我无法理解代码,并且在使用openCV版本设置cv::BackgroundSubtractorMOG2时遇到问题

预先感谢您的帮助

最佳答案

BackgroundSubtractorMOG2应该与#include "opencv2/video/background_segm.hpp"一起使用
使用OpenCV的示例有两个不错的c++示例(在samples\cpp目录中)。

  • bgfg_segm.cpp显示如何使用BackgroundSubtractorMOG2
  • bgfg_gmg.cpp使用BackgroundSubtractorGMG

  • 要获取最后一个值(并假设要获取前景像素值),可以使用前景蒙版复制帧。在以下示例的第一个示例中也是如此:
    bg_model(img, fgmask, update_bg_model ? -1 : 0);
    fgimg = Scalar::all(0);
    img.copyTo(fgimg, fgmask);
    

    关于c++ - OpencV中的背景和前景,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16808838/

    10-09 04:06