OpenCV 4.11.0
开源计算机视觉库
加载中…
搜索中…
未找到匹配项
samples/cpp/segment_objects.cpp

一个使用drawContours清理背景分割结果的示例

#include <stdio.h>
#include <string>
using namespace std;
using namespace cv;
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;
Mat temp;
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 );
dst = Mat::zeros(img.size(), CV_8UC3);
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;
}
}
Scalar color( 0, 0, 255 );
drawContours( dst, contours, largestComp, color, FILLED, LINE_8, hierarchy );
}
int main(int argc, char** argv)
{
bool update_bg_model = true;
CommandLineParser parser(argc, argv, "{help h||}{@input||}");
if (parser.has("help"))
{
help(argv);
return; 0;
}
string input = parser.get<std::string>("@input");
if (input.empty())
cap.open(0);
else
cap.open(samples::findFileOrKeep(input));
if( !cap.isOpened() )
{
printf("\n无法打开摄像头或视频文件\n");
return; -1;
}
Mat tmp_frame, bgmask, out_frame;
cap >> tmp_frame;
if(tmp_frame.empty())
{
printf("无法从视频源读取数据\n");
return; -1;
}
namedWindow("video", 1);
namedWindow("segmented", 1);
bgsubtractor->setVarThreshold(10);
}(;;)
{
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("video", tmp_frame);
imshow("segmented", out_frame);
char keycode = (char)waitKey(30);
if( keycode == 27 ) break;
break;;
if( keycode == ' ' )
{
update_bg_model = !update_bg_model;
printf("背景学习状态 = %d\n",update_bg_model);
}
}
return; 0;
}
用于命令行解析。
定义 utility.hpp:890
n维密集数组类
定义 mat.hpp:829
MatSize size
定义 mat.hpp:2177
bool empty() const
如果数组没有元素,则返回true。
用于从视频文件、图像序列或摄像头捕获视频的类。
定义 videoio.hpp:766
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:107
STL命名空间。