- 操作系统: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;
}
运行结果
