You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
2.5 KiB
101 lines
2.5 KiB
#include "opencv2/bgsegm.hpp" |
|
#include "opencv2/videoio.hpp" |
|
#include "opencv2/highgui.hpp" |
|
#include <opencv2/core/utility.hpp> |
|
#include <iostream> |
|
|
|
using namespace cv; |
|
using namespace cv::bgsegm; |
|
|
|
const String about = |
|
"\nA program demonstrating the use and capabilities of different background subtraction algrorithms\n" |
|
"Using OpenCV version " + String(CV_VERSION) + |
|
"\nPress q or ESC to exit\n"; |
|
|
|
const String keys = |
|
"{help h usage ? | | print this message }" |
|
"{vid | | path to a video file }" |
|
"{algo | GMG | name of the algorithm (GMG, CNT, KNN, MOG, MOG2) }" |
|
; |
|
|
|
static Ptr<BackgroundSubtractor> createBGSubtractorByName(const String& algoName) |
|
{ |
|
Ptr<BackgroundSubtractor> algo; |
|
if(algoName == String("GMG")) |
|
algo = createBackgroundSubtractorGMG(20, 0.7); |
|
else if(algoName == String("CNT")) |
|
algo = createBackgroundSubtractorCNT(); |
|
else if(algoName == String("KNN")) |
|
algo = createBackgroundSubtractorKNN(); |
|
else if(algoName == String("MOG")) |
|
algo = createBackgroundSubtractorMOG(); |
|
else if(algoName == String("MOG2")) |
|
algo = createBackgroundSubtractorMOG2(); |
|
|
|
return algo; |
|
} |
|
|
|
int main(int argc, char** argv) |
|
{ |
|
CommandLineParser parser(argc, argv, keys); |
|
parser.about(about); |
|
parser.printMessage(); |
|
if (parser.has("help")) |
|
{ |
|
parser.printMessage(); |
|
return 0; |
|
} |
|
|
|
String videoPath = parser.get<String>("vid"); |
|
String algoName = parser.get<String>("algo"); |
|
|
|
if (!parser.check()) |
|
{ |
|
parser.printErrors(); |
|
return 0; |
|
} |
|
|
|
Ptr<BackgroundSubtractor> bgfs = createBGSubtractorByName(algoName); |
|
if (!bgfs) |
|
{ |
|
std::cerr << "Failed to create " << algoName << " background subtractor" << std::endl; |
|
return -1; |
|
} |
|
|
|
VideoCapture cap; |
|
if (argc > 1) |
|
cap.open(videoPath); |
|
else |
|
cap.open(0); |
|
|
|
if (!cap.isOpened()) |
|
{ |
|
std::cerr << "Cannot read video. Try moving video file to sample directory." << std::endl; |
|
return -1; |
|
} |
|
|
|
Mat frame, fgmask, segm; |
|
|
|
namedWindow("FG Segmentation", WINDOW_NORMAL); |
|
|
|
for (;;) |
|
{ |
|
cap >> frame; |
|
|
|
if (frame.empty()) |
|
break; |
|
|
|
bgfs->apply(frame, fgmask); |
|
|
|
frame.convertTo(segm, CV_8U, 0.5); |
|
add(frame, Scalar(100, 100, 0), segm, fgmask); |
|
|
|
imshow("FG Segmentation", segm); |
|
|
|
int c = waitKey(30); |
|
if (c == 'q' || c == 'Q' || (c & 255) == 27) |
|
break; |
|
} |
|
|
|
return 0; |
|
}
|
|
|