bg_sub.cpp
這段代碼的功能是把視頻中的背景和前景分離,提取出前景的運(yùn)動(dòng)物體。根據(jù)用戶選擇的不同的模式,可以選擇基于MOG2或者基于KNN的方法來進(jìn)行背景減除。在處理每一幀圖像的過程中,首先使用背景減除模型對(duì)圖像幀進(jìn)行處理,得到一個(gè)前景掩碼,該掩碼中包含了所有被認(rèn)為是前景的像素。然后將處理后的掩碼圖像和原始幀同時(shí)顯示出來。通過這種方式,用戶能夠清楚看到前景移動(dòng)物體被成功地從背景中分離出來,這個(gè)過程是實(shí)時(shí)的。文章來源:http://www.zghlxwxcb.cn/news/detail-849403.html
/**
* @file bg_sub.cpp
* @brief 背景減除教程樣例代碼
* @author Domenico D. Bloisi
*/
#include <iostream> // 引入 C++ 的輸入輸出流庫
#include <sstream> // 引入字符串流,它是 iostream 的一部分,提供了方便的字符串輸入和輸出功能
#include <opencv2/imgcodecs.hpp> // 引入 OpenCV 的圖像編解碼模塊,用于圖像的讀取和保存
#include <opencv2/imgproc.hpp> // 引入 OpenCV 的圖像處理模塊,包含很多圖像處理的功能
#include <opencv2/videoio.hpp> // 引入 OpenCV 的視頻 IO 模塊,用于視頻保存和讀取、以及本機(jī)攝像頭的訪問
#include <opencv2/highgui.hpp> // 引入 OpenCV 的高級(jí) GUI 模塊,用于創(chuàng)建界面顯示圖像
#include <opencv2/video.hpp> // 引入 OpenCV 的視頻分析模塊,包含了許多常見的視頻分析算法,比如對(duì)象跟蹤、運(yùn)動(dòng)估計(jì)等
using namespace cv; // 使用 OpenCV 命名空間
using namespace std;
const char* params
= "{ help h | | Print usage }"
"{ input | vtest.avi | Path to a video or a sequence of image }"
"{ algo | MOG2 | Background subtraction method (KNN, MOG2) }";
int main(int argc, char* argv[])
{
// 命令行參數(shù)解析
CommandLineParser parser(argc, argv, params);
string about_message = "This program shows how to use background subtraction methods provided by "
" OpenCV. You can process both videos and images.\n";
parser.about(about_message);
if (parser.has("help")) // 如果有幫助信息
{
parser.printMessage(); // 打印使用幫助信息
}
// 創(chuàng)建背景減除對(duì)象
Ptr<BackgroundSubtractor> pBackSub;
//根據(jù)輸入確定使用 KNN 還是 MOG2
if (parser.get<String>("algo") == "MOG2")
pBackSub = createBackgroundSubtractorMOG2();
else
pBackSub = createBackgroundSubtractorKNN();
// 輸入視頻
VideoCapture capture( samples::findFile(parser.get<String>("input")) );
if (!capture.isOpened()){
cerr << "Unable to open: " << parser.get<String>("input") << endl;
return 0;
}
Mat frame, fgMask; // 定義圖像矩陣,用于讀取視頻幀以及存儲(chǔ)背景減除圖像
while (true) {
capture >> frame; // 讀取一幀
if (frame.empty())
break;
// 更新背景模型
pBackSub->apply(frame, fgMask);
// 在當(dāng)前幀上顯示幀編號(hào)
rectangle(frame, cv::Point(10, 2), cv::Point(100,20), cv::Scalar(255,255,255), -1);
// 在 frame 上畫一個(gè)白色矩形,左上角坐標(biāo)為(10, 2),右下角坐標(biāo)為(100, 20),顏色為白色(即 (255,255,255))。
stringstream ss;
ss << capture.get(CAP_PROP_POS_FRAMES);
// 用 stringstream 將視頻的當(dāng)前幀數(shù)轉(zhuǎn)換為字符串。
string frameNumberString = ss.str();
// 將幀數(shù)從 stringstream 轉(zhuǎn)換為 string。
putText(frame, frameNumberString.c_str(), cv::Point(15, 15), FONT_HERSHEY_SIMPLEX, 0.5 , cv::Scalar(0,0,0));
// 在 frame 上的(15, 15)位置用黑色字體輸出當(dāng)前的幀數(shù)。
// 顯示當(dāng)前幀和背景掩碼
imshow("Frame", frame);
imshow("FG Mask", fgMask);
int keyboard = waitKey(30); // 獲取鍵盤輸入
if (keyboard == 'q' || keyboard == 27)
break;
}
return 0;
}
文章來源地址http://www.zghlxwxcb.cn/news/detail-849403.html
到了這里,關(guān)于【opencv】教程代碼 —video(3) 視頻背景剔除的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!