`
javasogo
  • 浏览: 1815716 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

opencv实现连通域

J# 
阅读更多

在本文中使用图像连通域统计使用opencv中的cvFloodFill方法,但是在cvFloodFill方法中CvConnectedComp参数无法返回具体点坐标位置信息,找了些资料、给CvSeq分配空间但是还是contour内容没有值,估计是OPENCV2.00版本不支持。如果想获取点坐标信息有两种方法:一是通过源代码改写cvFloodFill函数来返回点坐标信息;二是cvFloodFill连通之后,根据返回区域统计多少个点,并统计之后对此点做标记,依次反复下一个连通区域。
以下是方法二的代码实现:

//连通区域结构
typedef struct MyConnectedComp
{
double area;
int value;
RECT rect;
list<POINT> listAllPoint;
}MyConnectedComp
/*
*功能说明:统计图像的连通区域
*参数说明:src,表示原始图象;rectSrc,表示图像区域;listData,表示连通域结构链表;nUnionColor,表示连通颜色(0,表示黑点;1,表示白点);nUnionMode,表示连通类型(0,表示4连通;1,表示8连通)
*返回值:int类型。-1,表示参数错误;0,表示非二值/灰度图像
*/
int ImageUnionByFloodFill(CxImage *src,RECT rectSrc,list<MyConnectedComp> &listData,int nUnionColor,int nUnionMode)
{
int nRet = 1;
//参数检测
if(src==NULL || !(nUnionColor==0||nUnionColor==1) || !(nUnionMode==1||nUnionMode==2) || (rectSrc.left==0 && rectSrc.right==0 || rectSrc.top==0 && rectSrc.bottom==0 || rectSrc.left>rectSrc.right || rectSrc.top>rectSrc.bottom))
{
nRet = -1;
return nRet;
}
if(src->GetBpp()>8)
{
nRet = 0;
return nRet;
}
listData.clear();
int nColor = 255;
if(nUnionColor==0)
{
nUnionColor = 255;
}
if(nUnionColor==1)
{
nUnionColor = 0;
}
int nFlag = 4;
if(nUnionMode==1)
{
nFlag = 4;
}
if(nUnionMode==2)
{
nFlag = 8;
}
int iBackColor = GetBlackColor(*src);
long i = 0,j = 0;
long m = 0,n = 0,newN = 0,newM = 0;
long nWidth = 0,nHeight = 0;

IplImage *pcvImageTmp = NULL;
if(!Cximage2IplImage(src,&pcvImageTmp))
{
return 0;
}
//如果是灰度图像,做二值化处理
if(src->GetBpp()!=1)
{
cvThreshold(pcvImageTmp,pcvImageTmp,128,255,CV_THRESH_BINARY);
}
CvSize size = cvGetSize(pcvImageTmp);
DatumnConnectedComp dccTmp;
CvConnectedComp comp;
CvPoint seed;
for(j=rectSrc.top;j<rectSrc.bottom;j++)
{
for(i=rectSrc.left;i<rectSrc.right;i++)
{
if(i<0 || i>=size.width || j<0 || j>=size.height)
{
continue;
}
uchar *p = (uchar *)&(pcvImageTmp->imageData+j*pcvImageTmp->widthStep)[i];
if(*p==nUnionColor || *p==100 || *p==101)
{
continue;
}
//处理为黑点,做连通
seed = cvPoint(i,j);
cvFloodFill(pcvImageTmp, seed,cvScalarAll(100), cvScalarAll(0),cvScalarAll(0), &comp, nFlag, 0 );
dccTmp.area = comp.area;
dccTmp.rect.left = comp.rect.x;
dccTmp.rect.top = comp.rect.y;
dccTmp.rect.right = comp.rect.x + comp.rect.width;
dccTmp.rect.bottom = comp.rect.y + comp.rect.height;
dccTmp.value = int(comp.value.val[1]);
dccTmp.listAllPoint.clear();
POINT ptInsert;
for(n=0;n<=comp.rect.height;n++)
{
for(m=0;m<comp.rect.width;m++)
{
newN = n + comp.rect.y;
newM = m + comp.rect.x;
if(newN>=size.height || newM>=size.width)
{
continue;
}
uchar *q = (uchar *)&(pcvImageTmp->imageData+newN*pcvImageTmp->widthStep)[newM];
if(*q==100)
{
ptInsert.x = newM;
ptInsert.y = newN;
dccTmp.listAllPoint.push_back(ptInsert);
*q = 101;//改变标记,说明已被连通
}
}
}
listData.push_back(dccTmp);
}
}
cvReleaseImage(&pcvImageTmp);
return nRet;
}

注:CxImage是一款优秀的图像操作类库。它可以快捷地存取、显示、转换各种图像。

下载地址:http://www.codeproject.com/KB/graphics/cximage.aspx

分享到:
评论

相关推荐

    opencv实现连通域标记

    本教程将深入探讨如何使用OpenCV实现连通域标记,这是一个在图像处理中非常重要的概念,尤其在图像分割、目标检测和图像分析中。 连通域标记,又称为连通组件标记或连通成分分析,是图像处理中的一个基本步骤。当...

    liantongyu.rar_opencv 连通域_opencv 连通域_连通域

    本资源"liantongyu.rar_opencv 连通域"提供了一个使用OpenCV库实现连通域检测的C代码示例。 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,包含了众多图像处理和计算机...

    获取连通域(可根据面积筛选封闭图形)

    本文将深入探讨如何使用OpenCV库来实现连通域分析,并通过设置面积阈值来筛选出感兴趣的封闭图形。 #### 技术背景 **OpenCV**(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它...

    opencv寻找图片内的最大连通域

    本教程将详细介绍如何使用OpenCV寻找图片内的最大连通域,并讨论如何将其修改为寻找最小连通域。 首先,我们要理解什么是连通域。在二值图像中,连通域是由像素值相同的相邻像素组成的一片区域。在寻找连通域时,...

    opencv+连通域统计+图像识别+统计物品数量

    1、基于opencv实现 2、基于连通域实现了物品的统计与标色

    cv.zip_C# 连通域_opencv 连通域_最大连通域

    本项目聚焦于使用C#编程语言结合OpenCV库来实现图像的连通域查找、标注以及确定最大的连通域。以下是关于这个主题的详细讲解。 首先,我们需要理解连通域的基本概念。在二值图像中,连通域是指像素值相同的相邻像素...

    使用opencv去掉二值化图像中黑色面积较小的连通域

    本文将详细介绍如何使用OpenCV实现这一功能。 首先,我们需要理解连通域的概念。在二值图像中,如果两个像素具有相同的灰度值,并且可以通过水平、垂直或对角线方向的相邻像素链相连,那么它们就属于同一个连通域。...

    connectedAnalysis_opencv识别_连通域_

    在OpenCV中,可以使用`findContours`函数来检测图像中的连通域。 `findContours`函数首先从二值图像中提取轮廓,这些轮廓通常代表了连通域的边界。这个函数返回一个包含所有轮廓的列表,每个轮廓又是一个由点坐标...

    opencvsharp的获取连通区域

    OpenCVSharp是一个C#封装的OpenCV库,它为.NET开发者提供了访问OpenCV的强大功能。在图像处理和计算机视觉领域,获取连通区域是至关重要的一步,它可以帮助我们识别和分割图像中的对象。本篇文章将深入探讨如何使用...

    Opencv基于findContours的微小连通域去除

    在实际应用中,`findContours`常与其他OpenCV函数结合使用,如`cv2.drawContours`绘制轮廓,`cv2.filter2D`进行滤波操作,或者`cv2.morphologyEx`进行形态学操作,如开闭运算,以帮助消除噪声和分离连通域。...

    python验证码识别教程之利用投影法、连通域法分割图片

    代码中,`cfs`函数实现了这一过程,利用队列(`queue.Queue()`)进行广度优先搜索,遍历并标记连通域,从而确定每个字符的边界。 除了上述两种方法,还可以结合其他图像处理技术,如形态学操作(如膨胀和腐蚀)来...

    BWLabel.zip_C# 连通域_bwlabel_c连通域_连通域标记_连通标记

    本文将深入探讨C#实现的连通域标记算法,特别是使用`bwlabel`函数,以及如何在C#中实现连通标记。 连通域标记是图像分析中的一个关键步骤,它的目的是将图像中相同属性的相邻像素(例如,颜色、亮度或纹理)分组到...

    连通域分割代码 vs2015+opencv3.3

    连通域分割是一种在计算机视觉和图像处理领域中常见的技术,用于将图像...开发者需要熟悉如何读取和操作图像,理解二值化、形态学操作、轮廓检测等技术,并能够有效地利用OpenCV提供的工具来实现连通域的分割和分析。

    使用OpenCV获取图片连通域数量,并用不同颜色标记函

    本篇文章将探讨如何利用OpenCV获取图片的连通域数量,并使用不同的颜色进行标记。连通域是指在二值图像中,相同颜色或亮度值的相邻像素组成的一个连续区域。了解这个概念对于图像分割、物体识别等应用至关重要。 ...

    OpenVC 查找连通域

    OpenCV是一个强大的开源计算机视觉库,提供了多种实现连通域查找的方法。在VS2012集成开发环境中使用OpenCV进行空白连通域检查,可以帮助我们检测和分析图像中的空洞或无像素区域。 首先,我们需要理解OpenCV的基本...

    基于游程链的连通区域标记的图像连通域(blob)C++实现

    本节将详细介绍基于游程链的连通区域标记的图像连通域(Blob)C++实现,以及与OpenCV的连通域实现方式的区别。 游程链编码(Run-Length Encoding, RLE)是一种数据压缩技术,适用于处理二值图像。在二值图像中,...

    基于C++与OpenCV实现图像预处理与连通域分析的Halcon连接应用

    内容概要:本文介绍了一种利用 C++ 和 OpenCV 库进行图像预处理及后续连通域分析的技术方法。首先实现了对输入图像的读取以及直方图均衡化操作,接着定义了一个自定义函数进行对数变换以增强图像对比度。之后对变换...

    连通域算法.zip

    OpenCV是一个广泛使用的开源计算机视觉库,它提供了多种实现连通域算法的方法,包括两边扫描法和种子填充法。这两种方法在处理二值图像时特别有用,例如在分割、物体识别或图像标记等任务中。 首先,我们来详细探讨...

    图像处理连通域算法 c++

    在图像处理领域,连通域算法是一种非常...在C++中实现连通域算法需要对图像处理的基本概念有清晰的理解,同时也需要熟悉C++编程和可能涉及到的图像处理库。通过实践和学习,你将能够灵活运用这个工具解决各种实际问题。

Global site tag (gtag.js) - Google Analytics