OpenCV CUDA模块图像处理------图像连通域标记接口函数connectedComponents()

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

该函数在 GPU 上执行二值图像的连通域标记操作,即将图像中所有相连的前景像素区域赋予相同的标签(label),以便后续分析和处理。

返回的 labels 是一个与输入图像大小相同的数据矩阵,其中每个像素的值表示它所属的连通域编号(从 0 开始)。

该函数接收一个二值图像作为输入,并执行连通组件标记(Connected Components Labeling)。输出是一个为每个连通组件分配了唯一标签(整数值)的图像。ltype指定了输出标签图像的类型,这是基于总标签数或源图像中的总像素数的重要考虑因素。ccltype指定了要使用的连通组件标记算法,当前支持BKE [11]算法,详情请参见ConnectedComponentsAlgorithmsTypes。请注意,输出中的标签不需要是连续的。

函数原型

cpp 复制代码
void cv::cuda::connectedComponents 
(
 	InputArray  	image,
	OutputArray  	labels,
	int  	connectivity,
	int  	ltype,
	cv::cuda::ConnectedComponentsAlgorithmsTypes  	ccltype 
) 	

参数

  • image:需要被标记的8位单通道图像。
  • labels:目标标记图像。
  • connectivity:用于标记过程的连通性。支持使用8表示8向连通性。
  • ltype:输出图像标签类型。当前支持CV_32S。
  • ccltype:连通组件算法类型(详见ConnectedComponentsAlgorithmsTypes)。

注意:一个演示如何在CUDA中实现连通组件标记的示例程序可以在opencv_contrib_source_code/modules/cudaimgproc/samples/connected_components.cpp找到。

代码示例

cpp 复制代码
#include <opencv2/cudaimgproc.hpp>
#include <opencv2/opencv.hpp>

int main()
{
    // Step 1: 加载图像并转换为二值图像
    cv::Mat h_img = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/stich1.png", cv::IMREAD_GRAYSCALE );
    if ( h_img.empty() )
    {
        std::cerr << "Failed to load image!" << std::endl;
        return -1;
    }

    // 将灰度图像二值化
    cv::threshold( h_img, h_img, 128, 255, cv::THRESH_BINARY );

    // Step 2: 将图像上传到 GPU
    cv::cuda::GpuMat d_img, d_labels;
    d_img.upload( h_img );

    // Step 3: 执行连通域标记
    int connectivity = 8;       // 使用 8 连通
    int ltype        = CV_32S;  // 输出标签类型为 32 位整型

    // 确保使用的算法类型是有效的
    cv::cuda::ConnectedComponentsAlgorithmsTypes ccltype = cv::cuda::CCL_DEFAULT;

    cv::cuda::connectedComponents( d_img, d_labels, connectivity, ltype, ccltype );

    // Step 4: 下载结果并显示
    cv::Mat h_labels;
    d_labels.download( h_labels );

    // 可视化:将标签映射为颜色
    cv::Mat coloredLabels;
    h_labels.convertTo( coloredLabels, CV_8U, 255.0 / cv::countNonZero( h_labels ) );  // 正常化标签值到[0, 255]

    // 应用伪色彩映射
    cv::applyColorMap( coloredLabels, coloredLabels, cv::COLORMAP_JET );

    cv::imshow( "Original Image", h_img );
    cv::imshow( "Connected Components", coloredLabels );
    cv::waitKey( 0 );

    return 0;
}

运行结果

相关推荐
赛卡7 分钟前
汽车安全:功能安全FuSa、预期功能安全SOTIF与网络安全Cybersecurity 解析
人工智能·安全·网络安全·车载系统·自动驾驶·汽车
layneyao14 分钟前
RPA+AI:自动化办公机器人开发指南
人工智能·自动化·rpa
Ama_tor1 小时前
14.AI搭建preparationのBERT预训练模型进行文本分类
人工智能·深度学习·bert
QQ676580081 小时前
基于 PyTorch 的 VGG16 深度学习人脸识别检测系统的实现+ui界面
人工智能·pytorch·python·深度学习·ui·人脸识别
张较瘦_2 小时前
[论文阅读] 人工智能 | 用大语言模型解决软件元数据“身份谜题”:科研软件的“认脸”新方案
论文阅读·人工智能·语言模型
Blossom.1182 小时前
量子通信:从科幻走向现实的未来通信技术
人工智能·深度学习·目标检测·机器学习·计算机视觉·语音识别·量子计算
平凡灵感码头2 小时前
OpenAI 即将推出 GPT-5:开启多模态、持续记忆对话新时代
人工智能·gpt
软件测试小仙女2 小时前
鸿蒙APP测试实战:从HDC命令到专项测试
大数据·软件测试·数据库·人工智能·测试工具·华为·harmonyos
三花AI3 小时前
ComfyUI 子工作流功能:一次编辑全局更新
人工智能
大模型铲屎官3 小时前
【深度学习-Day 23】框架实战:模型训练与评估核心环节详解 (MNIST实战)
人工智能·pytorch·python·深度学习·大模型·llm·mnist