【opencv】示例-ffilldemo 使用floodFill()函数进行区域泛洪填充

这篇具有很好参考价值的文章主要介绍了【opencv】示例-ffilldemo 使用floodFill()函数进行区域泛洪填充。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【opencv】示例-ffilldemo 使用floodFill()函数进行区域泛洪填充,opencv,人工智能,计算机视觉

【opencv】示例-ffilldemo 使用floodFill()函数进行区域泛洪填充,opencv,人工智能,计算机视觉

image

【opencv】示例-ffilldemo 使用floodFill()函数进行区域泛洪填充,opencv,人工智能,计算机视觉

mask

【opencv】示例-ffilldemo 使用floodFill()函数进行区域泛洪填充,opencv,人工智能,计算机视觉

mask

【opencv】示例-ffilldemo 使用floodFill()函数进行区域泛洪填充,opencv,人工智能,计算机视觉

#include "opencv2/imgproc.hpp" // 包含OpenCV图像处理头文件
#include "opencv2/imgcodecs.hpp" // 包含OpenCV图像编码头文件
#include "opencv2/videoio.hpp" // 包含OpenCV视频IO头文件
#include "opencv2/highgui.hpp" // 包含OpenCV高层GUI头文件


#include <iostream> // 包含标准输入输出流库


using namespace cv; // 使用命名空间cv,避免每次调用OpenCV函数时都要写cv::
using namespace std; // 使用命名空间std,避免每次使用标准库时都要写std::


// 帮助函数,输出程序用法信息
static void help(char** argv)
{
    // 输出程序的使用说明
    cout << "\nThis program demonstrated the floodFill() function\n"
            "Call:\n"
        <<  argv[0]
        <<  " [image_name -- Default: fruits.jpg]\n" << endl;


    // 输出热键信息
    cout << "Hot keys: \n"
            "\tESC - quit the program\n" // ESC键退出程序
            "\tc - switch color/grayscale mode\n" // c键切换颜色/灰度模式
            "\tm - switch mask mode\n" // m键切换掩膜模式
            "\tr - restore the original image\n" // r键恢复原始图像
            "\ts - use null-range floodfill\n" // s键使用零范围泛洪填充(Simple floodfill)
            "\tf - use gradient floodfill with fixed(absolute) range\n" // f键使用固定范围渐变泛洪填充(Fixed Range floodfill)
            "\tg - use gradient floodfill with floating(relative) range\n" // g键使用浮动范围渐变泛洪填充(Gradient floodfill)
            "\t4 - use 4-connectivity mode\n" // 4键使用4连通模式
            "\t8 - use 8-connectivity mode\n" << endl; // 8键使用8连通模式
}


// 定义全局变量
Mat image0, image, gray, mask; // 原图像、当前图像、灰度图和掩膜图
int ffillMode = 1; // 泛洪填充模式,默认为1
int loDiff = 20, upDiff = 20; // 泛洪填充的下差和上差
int connectivity = 4; // 连接模式,默认为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; // 根据ffillMode确定下差
    int up = ffillMode == 0 ? 0 : upDiff; // 根据ffillMode确定上差
    // 构建标志信息,包含连接模式、新掩膜值、以及填充模式
    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 << " pixels were repainted\n"; // 输出重绘像素数
}


// 程序主函数
int main( int argc, char** argv )
{
    // 解析命令行参数
    cv::CommandLineParser parser (argc, argv,
        "{help h | | show help message}{@image|fruits.jpg| input image}"
    );
    if (parser.has("help")) // 如果带有help参数,则显示帮助信息
    {
        parser.printMessage();
        return 0;
    }
    // 获取命令行指定的图像文件名称,如果没有指定则为默认值
    string filename = parser.get<string>("@image");
    // 加载图像
    image0 = imread(samples::findFile(filename), 1);


    if( image0.empty() ) // 如果图像为空,则输出提示信息并返回
    {
        cout << "Image empty\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 ) // 如果按键是ESC,则退出程序
        {
            cout << "Exiting ...\n";
            break;
        }
        // 根据按键进行不同的操作
        switch( c )
        {
        case 'c': // 切换颜色模式
            if( isColor )
            {
                cout << "Grayscale mode is set\n";
                cvtColor(image0, gray, COLOR_BGR2GRAY); // 转换为灰度图像
                mask = Scalar::all(0); // 重置掩膜
                isColor = false;
            }
            else
            {
                cout << "Color mode is set\n";
                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 << "Original image is restored\n";
            image0.copyTo(image); // 拷贝原图到当前图像
            cvtColor(image, gray, COLOR_BGR2GRAY); // 转换为灰度图
            mask = Scalar::all(0); // 重置掩膜
            break;
        case 's': // 设置为简单泛洪填充模式
            cout << "Simple floodfill mode is set\n";
            ffillMode = 0;
            break;
        case 'f': // 设置为固定范围渐变泛洪填充模式
            cout << "Fixed Range floodfill mode is set\n";
            ffillMode = 1;
            break;
        case 'g': // 设置为浮动范围渐变泛洪填充模式
            cout << "Gradient (floating range) floodfill mode is set\n";
            ffillMode = 2;
            break;
        case '4':
            // 当用户按下'4'键时,输出提示信息并设置连通性为4(4连通)
            cout << "4-connectivity mode is set\n";
            connectivity = 4; // 设置连通性变量为4,意味着接下来floodFill操作将使用4连通区域
            break; // 跳出switch
        case '8':
            // 当用户按下'8'键时,输出提示信息并设置连通性为8(8连通)
            cout << "8-connectivity mode is set\n";
            connectivity = 8; // 设置连通性变量为8,意味着接下来floodFill操作将使用8连通区域
            break; // 跳出switch
        }
    }


    return 0; // 程序结束,返回0值
}
int area = floodFill(dst, mask, seed, newVal, &ccomp, 
Scalar(lo, lo, lo), Scalar(up, up, up), flags);

【opencv】示例-ffilldemo 使用floodFill()函数进行区域泛洪填充,opencv,人工智能,计算机视觉文章来源地址https://www.toymoban.com/news/detail-848904.html

到了这里,关于【opencv】示例-ffilldemo 使用floodFill()函数进行区域泛洪填充的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【精选】使用opencv的resize函数进行等比例放大或缩小图像

    在 OpenCV 中,使用 resize() 函数可以对图像进行缩放操作。若要按比例扩大或缩小图像,可以通过指定目标大小,并结合原始图像的尺寸进行等比例扩大。 以下是一个示例代码,展示了如何在 Python 中使用 OpenCV 对图像进行等比例扩大: 这段代码首先读取原始图像,然后获取其

    2024年02月03日
    浏览(29)
  • 树莓派CSI摄像头使用python调用opencv库函数进行运动检测识别

    目录 一、完成摄像头的调用 二、利用python调用opencv库函数对图像进行处理 2.1 图像处理大体流程 2.2 opencv调用函数的参数以及含义 2.2.1 ret, img = cap.read() 读取帧图像 2.2.2 cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 灰度图像 2.2.3 gray_diff_img = cv2.absdiff(gray_img, previous_img) 帧差法 2.2.4 cv2.thre

    2024年02月15日
    浏览(39)
  • opencv 连通域操作示例代码记录connectedComponentsWithStats()函数示例

    上面这个代码是MFC程序里面的一个函数,不能够直接运行,但是如果学过MFC相信没有问题完全能够看得懂。 上例当中,count=7(也许可能是count,我写成了cout,也就不改了).说明检测到7个连通域。

    2024年02月06日
    浏览(45)
  • OPENCV 闭运算实验示例代码morphologyEx()函数

     闭运算就是先膨胀,后腐蚀,膨胀或者腐蚀的对象都是针对非零像素,也就是图片当中不是全黑的那部分像素-----或者说灰度值等于0的那些个像素。膨胀导致非零像素膨胀,黑像素就会缩小, 腐蚀导致非零像素减少,黑色像素就会增多。也许有人会搞不清这一点 闭运算是先

    2024年02月07日
    浏览(35)
  • 【C++】【Opencv】minMaxLoc()函数详解和示例

    minMaxLoc()函数 是 OpenCV 库中的一个函数,用于找到一个多维数组中的最小值和最大值,以及它们的位置。这个函数对于处理图像和数组非常有用。本文通过参数和示例详解,帮助大家理解和使用该函数。 函数原型: 参数详解: 在这个示例中,我们首先读取一张灰度图像。

    2024年02月03日
    浏览(29)
  • 【C++】【Opencv】cv::Canny()边缘检测函数详解和示例

    Canny边缘检测是一种流行的边缘检测算法,由John F. Canny在1986年开发。它是一种多阶段过程,包括噪声滤波、计算图像强度的梯度、非最大值抑制以及双阈值检测。本文通过函数原型解读和示例对cv::Canny()函数进行详解,以帮助大家理解和使用。 Canny边缘检测的步骤如下: (

    2024年02月04日
    浏览(42)
  • 【opencv】示例-image_alignment.cpp 利用ECC 算法进行图像对齐

    affine homography 这段代码是一个 利用ECC (Enhanced Correlation Coefficient) 算法进行图像对齐的示例 。代码首先包含了OpenCV库的头文件,并且使用了OpenCV和标准库的命名空间。然后定义了几个函数和宏进行图像变换矩阵的操作,定义了一些用于解析命令行参数的。 main 函数中,

    2024年04月13日
    浏览(32)
  • python使用opencv实现识别指定区域的行人

    1、案例介绍         案例实现对视频中的行人进行实时检测,并可在视频画面通过鼠标绘制矩形区域,行人经过区域内后,程序会进行判断行人已进入该区域,行人检测框颜色将变为蓝色。该程序主要使用python的opencv模块实现,实现流程:首先利用Haar分类器实现行人检测

    2024年02月09日
    浏览(31)
  • 使用GIS空间分析进行植物生长区域选址

    经过观察可以发现某种珍贵植物在山区的某个区域位置生长状况明显要比其他区域好很多,通过研究了解到这种植物生长具有严格的生长条件。为了能更好地保护该种植物的生长环境,现在需要使用GIS空间分析方法,将适合植物生长的区域找出来。 树谷资料库资源大全(3月

    2023年04月09日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包