#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;
}
如果陣列沒有元素,則返回 true。
int64_t int64
MatSize size
定義 mat.hpp:2187
cv::getTickFrequency
double getTickFrequency()
用於從影片檔案、影像序列或攝像頭捕獲影片的類。
Definition videoio.hpp:772
virtual bool open(const String &filename, int apiPreference=CAP_ANY)
開啟影片檔案或捕獲裝置或 IP 影片流以進行影片捕獲。
virtual bool isOpened() const
如果影片捕獲已初始化,則返回 true。
std::shared_ptr< _Tp > Ptr
Definition cvstd_wrapper.hpp:23
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