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

使用泛洪填充技术的示例

#include <iostream>
using namespace cv;
using namespace std;
static void help(char** argv)
{
cout << "\n此程序演示了floodFill()函数\n"
"调用方式:\n"
<< argv[0]
<< " [图像名称 -- 默认值:fruits.jpg]\n" << endl;
cout << "热键:\n"
"\tESC - 退出程序\n"
"\tc - 切换彩色/灰度模式\n"
"\tm - 切换掩码模式\n"
"\tr - 恢复原始图像\n"
"\ts - 使用无范围泛洪填充\n"
"\tf - 使用具有固定(绝对)范围的梯度泛洪填充\n"
"\tg - 使用具有浮动(相对)范围的梯度泛洪填充\n"
"\t4 - 使用4连通性模式\n"
"\t8 - 使用8连通性模式\n" << endl;
}
Mat image0, image, gray, mask;
int ffillMode = 1;
int loDiff = 20, upDiff = 20;
int connectivity = 4;
int isColor = true;
bool useMask = false;
int newMaskVal = 255;
static void onMouse( int event, int x, int y, int, void* )
{
if( event != EVENT_LBUTTONDOWN )
return;;
Point seed = Point(x,y);
int lo = ffillMode == 0 ? 0 : loDiff;
int up = ffillMode == 0 ? 0 : upDiff;
int flags = connectivity + (newMaskVal << 8) +
(ffillMode == 1 ? FLOODFILL_FIXED_RANGE : 0);
int b = (unsigned)theRNG() & 255;
int g = (unsigned)theRNG() & 255;
int r = (unsigned)theRNG() & 255;
Rect ccomp;
Scalar newVal = isColor ? Scalar(b, g, r) : Scalar(r*0.299 + g*0.587 + b*0.114);
Mat dst = isColor ? image : gray;
int area;
if( useMask )
{
threshold(mask, mask, 1, 128, THRESH_BINARY);
area = floodFill(dst, mask, seed, newVal, &ccomp, Scalar(lo, lo, lo),
Scalar(up, up, up), flags);
imshow( "mask", mask );
}
else
{
area = floodFill(dst, seed, newVal, &ccomp, Scalar(lo, lo, lo),
Scalar(up, up, up), flags);
}
imshow("image", dst);
cout << area << " 像素已重新绘制\n";
}
int main( int argc, char** argv )
{
cv::CommandLineParser parser (argc, argv,
"{help h | | 显示帮助信息}{@image|fruits.jpg| 输入图像}"
);
if (parser.has("help"))
{
parser.printMessage();
return; 0;
}
string filename = parser.get<string>("@image");
image0 = imread(samples::findFile(filename), 1);
if( image0.empty() )
{
cout << "图像为空\n";
parser.printMessage();
return; 0;
}
help(argv);
image0.copyTo(image);
cvtColor(image0, gray, COLOR_BGR2GRAY);
mask.create(image0.rows+2, image0.cols+2, CV_8UC1);
namedWindow( "image", 0 );
createTrackbar( "lo_diff", "image", &loDiff, 255, 0 );
createTrackbar( "up_diff", "image", &upDiff, 255, 0 );
setMouseCallback( "image", onMouse, 0 );
for(;;){(;;)
{
imshow("image", isColor ? image : gray);
char c = (char)waitKey(0);
if( c == 27 )
{
cout << "退出...\n";
break;;
}
switch( c )
{
case 'c':
if( isColor )
{
cout << "已设置为灰度模式\n";
cvtColor(image0, gray, COLOR_BGR2GRAY);
mask = Scalar::all(0);
isColor = false;
}
else
{
else {
image0.copyTo(image);
mask = Scalar::all(0);
isColor = true;}
}
break;;
case 'm':
if( useMask )
{
destroyWindow( "mask" );
useMask = false;
}
else
{
namedWindow( "mask", 0 );
mask = Scalar::all(0);
imshow("mask", mask);
useMask = true;
}
break;;
case 'r':
cout << "已恢复原始图像\n";
image0.copyTo(image);
image0.copyTo(image);
mask = Scalar::all(0);
break;;
case 's':
cout << "已设置为简单泛洪填充模式\n";
ffillMode = 0;
break;;
case 'f':
cout << "已设置为固定范围泛洪填充模式\n";
ffillMode = 1;
break;;
case 'g':
cout << "已设置为梯度(浮动范围)泛洪填充模式\n";
ffillMode = 2;
break;;
case '4':
cout << "已设置为4连通性模式\n";
连接性 = 4;
break;;
case '8'
cout << "已设置8连接模式\n";
connectivity = 8;
break;;
}
}
return; 0;
}
用于命令行解析。
定义 utility.hpp:890
n维稠密数组类
定义 mat.hpp:829
二维矩形的模板类。
定义 types.hpp:444
#define CV_8UC1
定义 interface.h:88
GMat mask(const GMat &src, const GMat &mask)
将掩码应用于矩阵。
void imshow(const String &winname, InputArray mat)
在指定的窗口中显示图像。
int waitKey(int delay=0)
等待按键按下。
void namedWindow(const String &winname, int flags=WINDOW_AUTOSIZE)
创建一个窗口。
void destroyWindow(const String &winname)
销毁指定的窗口。
void setMouseCallback(const String &winname, MouseCallback onMouse, void *userdata=0)
为指定的窗口设置鼠标处理程序。
int createTrackbar(const String &trackbarname, const String &winname, int *value, int count, TrackbarCallback onChange=0, void *userdata=0)
创建一个轨迹条并将其附加到指定的窗口。
CV_EXPORTS_W Mat imread(const String &filename, int flags=IMREAD_COLOR_BGR)
从文件中加载图像。
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0, AlgorithmHint hint=cv::ALGO_HINT_DEFAULT)
将图像从一个颜色空间转换为另一个颜色空间。
int floodFill(InputOutputArray image, InputOutputArray mask, Point seedPoint, Scalar newVal, Rect *rect=0, Scalar loDiff=Scalar(), Scalar upDiff=Scalar(), int flags=4)
用给定的颜色填充连接的组件。
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
定义 core.hpp:107
STL 命名空间。