opencv3.10中4種視訊前景提取
阿新 • • 發佈:2019-02-05
#include <iostream> #include <string> #include "opencv2/core.hpp" #include "opencv2/core/utility.hpp" #include "opencv2/cudabgsegm.hpp" #include "opencv2/cudalegacy.hpp" #include "opencv2/video.hpp" #include "opencv2/highgui.hpp" using namespace std; using namespace cv; using namespace cv::cuda; enum Method { MOG, MOG2, GMG, FGD_STAT }; int main(int argc, const char** argv) { bool useCamera = false; string file = "MAH00054.MP4"; Method method = FGD_STAT; VideoCapture cap; if (useCamera) cap.open(0); else cap.open(file); if (!cap.isOpened()) { cerr << "can not open camera or video file" << endl; return -1; } Mat frame; cap >> frame; GpuMat d_frame(frame); Ptr<BackgroundSubtractor> mog = cuda::createBackgroundSubtractorMOG(); Ptr<BackgroundSubtractor> mog2 = cuda::createBackgroundSubtractorMOG2(); Ptr<BackgroundSubtractor> gmg = cuda::createBackgroundSubtractorGMG(40); Ptr<BackgroundSubtractor> fgd = cuda::createBackgroundSubtractorFGD(); GpuMat d_fgmask; GpuMat d_fgimg; GpuMat d_bgimg; Mat fgmask; Mat fgimg; Mat bgimg; switch (method) { case MOG: mog->apply(d_frame, d_fgmask, 0.01); break; case MOG2: mog2->apply(d_frame, d_fgmask); break; case GMG: gmg->apply(d_frame, d_fgmask); break; case FGD_STAT: fgd->apply(d_frame, d_fgmask); break; } namedWindow("image", WINDOW_NORMAL); namedWindow("foreground mask", WINDOW_NORMAL); namedWindow("foreground image", WINDOW_NORMAL); if (method != GMG) { namedWindow("mean background image", WINDOW_NORMAL); } for(;;) { cap >> frame; if (frame.empty()) break; d_frame.upload(frame); int64 start = cv::getTickCount(); //update the model switch (method) { case MOG: mog->apply(d_frame, d_fgmask, 0.01); mog->getBackgroundImage(d_bgimg); break; case MOG2: mog2->apply(d_frame, d_fgmask); mog2->getBackgroundImage(d_bgimg); break; case GMG: gmg->apply(d_frame, d_fgmask); break; case FGD_STAT: fgd->apply(d_frame, d_fgmask); fgd->getBackgroundImage(d_bgimg); break; } double fps = cv::getTickFrequency() / (cv::getTickCount() - start); std::cout << "FPS : " << fps << std::endl; d_fgimg.create(d_frame.size(), d_frame.type()); d_fgimg.setTo(Scalar::all(0)); d_frame.copyTo(d_fgimg, d_fgmask); d_fgmask.download(fgmask); d_fgimg.download(fgimg); if (!d_bgimg.empty()) d_bgimg.download(bgimg); imshow("image", frame); imshow("foreground mask", fgmask); imshow("foreground image", fgimg); if (!bgimg.empty()) imshow("mean background image", bgimg); int key = waitKey(30); if (key == 27) break; } return 0; }