#include <stdio.h>
#include <string>
static void help(char** argv)
{
printf("\n"
"该程序演示了背景减除的连通分量清理的简单方法\n"
"程序启动时,它会开始学习背景。\n"
"您可以通过按下空格键来切换背景学习的开启和关闭。\n"
"调用\n"
"%s [视频文件,否则读取摄像头 0]\n\n", argv[0]);
}
static void refineSegments(
const Mat& img,
Mat& mask,
Mat& dst)
{
int niters = 3;
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
dilate(mask, temp,
Mat(),
Point(-1,-1), niters);
erode(temp, temp,
Mat(),
Point(-1,-1), niters*2);
dilate(temp, temp,
Mat(),
Point(-1,-1), niters);
findContours( temp, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE );
if( contours.size() == 0 )
return;
int idx = 0, largestComp = 0;
double maxArea = 0;
for( ; idx >= 0; idx = hierarchy[idx][0] )
{
const vector<Point>& c = contours[idx];
double area = fabs(contourArea(
Mat(c)));
if( area > maxArea )
{
maxArea = area;
largestComp = idx;
}
}
drawContours( dst, contours, largestComp, color, FILLED, LINE_8, hierarchy );
}
int main(
int argc,
char** argv)
{
bool update_bg_model = true;
if (parser.has("help"))
{
help(argv);
return 0;
}
string input = parser.get<std::string>("@input");
if (input.empty())
else
cap.
open(samples::findFileOrKeep(input));
{
printf("\n无法打开摄像头或视频文件\n");
return -1;
}
Mat tmp_frame, bgmask, out_frame;
cap >> tmp_frame;
{
printf("无法从视频源读取数据\n");
return -1;
}
bgsubtractor->setVarThreshold(10);
for(;;)
{
cap >> tmp_frame;
if( tmp_frame.empty() )
break;
bgsubtractor->apply(tmp_frame, bgmask, update_bg_model ? -1 : 0);
refineSegments(tmp_frame, bgmask, out_frame);
imshow(
"segmented", out_frame);
if( keycode == 27 )
break;
if( keycode == ' ' )
{
update_bg_model = !update_bg_model;
printf("学习背景处于状态 = %d\n",update_bg_model);
}
}
return 0;
}
用于命令行解析。
定义 utility.hpp:820
MatSize size
定义 mat.hpp:2160
bool empty() const
如果数组没有元素,则返回 true。
用于从视频文件、图像序列或摄像头进行视频捕获的类。
定义 videoio.hpp:731
virtual bool open(const String &filename, int apiPreference=CAP_ANY)
打开视频文件或捕获设备或 IP 视频流进行视频捕获。
virtual bool isOpened() const
如果视频捕获已经初始化,则返回 true。
std::shared_ptr< _Tp > Ptr
定义 cvstd_wrapper.hpp:23
#define CV_8UC3
定义 interface.h:90
void imshow(const String &winname, InputArray mat)
在指定窗口中显示图像。
int waitKey(int delay=0)
等待按键按下。
void namedWindow(const String &winname, int flags=WINDOW_AUTOSIZE)
创建窗口。
void drawContours(InputOutputArray image, InputArrayOfArrays contours, int contourIdx, const Scalar &color, int thickness=1, int lineType=LINE_8, InputArray hierarchy=noArray(), int maxLevel=INT_MAX, Point offset=Point())
绘制轮廓轮廓或填充轮廓。
Ptr< BackgroundSubtractorMOG2 > createBackgroundSubtractorMOG2(int history=500, double varThreshold=16, bool detectShadows=true)
创建 MOG2 背景减除器。
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
"黑盒" 表示与磁盘上的文件关联的文件存储。
定义 core.hpp:102