首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 平面设计 > 图形图像 >

opencv里的CvConnectedComp解决办法

2013-01-09 
opencv里的CvConnectedComp我使用cvPyrSegmentation对一副图像进行色彩分割,返回的结果有一个CvConnectedC

opencv里的CvConnectedComp
我使用cvPyrSegmentation对一副图像进行色彩分割,返回的结果有一个CvConnectedComp
它包含了各个连通域的信息,我现在想对每个连通域进行遍历,请问如何操作。。。
谢谢

[解决办法]
你这个是个CvSeq序列吧,每个元素是CvConnectedComp类型?

CvSeq是跟CvMemStorage搭配使用的,数据存储在CvMemStorage里,怎么遍历跟c++的STL容器差不多,简单说就是个数组,你看看CvSeq的成员函数就知道了

CvConnectedComp结构:
  typedef struct CvConnectedComp
  {
    double area;
    CvScalar value;
    CvRect rect;
    CvSeq* contour;
  } CvConnectedComp;

openCV的问题去这里看比较好:http://www.opencv.org.cn/
[解决办法]
好像cvPyrSegmentation得到的CvConnectedComp 并不包含contour信息,估计你得对每个区域转成二值图像来提取,或者直接在分割图上提取
typedef struct CvConnectedComp
{
    double area; /* 连通域的面积 */
    float value; /* 分割域的灰度缩放值 */
    CvRect rect; /* 分割域的 ROI */
} CvConnectedComp;

[解决办法]

引用:
没听太懂。。。 
转换为二值图像是什么意思,连通区域可能有很多啊。。。

你想要哪个区域的轮廓就以这个区域的value来把图像二值化,然后用openCV的函数提取
[解决办法]
cvThreshold用来二值化图像,你可以将你所需要提取的区域置为白色,其他区域置黑,然后二值化,然后用FindContours函数来获取轮廓。openCV带的有提取轮廓的示例:squares (CVPR01_course)


[解决办法]
引用:
比方吧,我想把彩色分割后标号为2的区域进行反色,该怎么操作?谢谢~

这个不是很简单吗?假设CvConnectedComp data存的是标号2区域,则
CvScalar color = data.value;
//填充此区域为白色(最大灰度色,用于二值化)
cvFloodFill( color_img, seed, color, CV_RGB( 255,255, 255 );
//把此彩色图转为灰度图
cvCvtColor( color_img, gray_img, CV_BGR2GRAY );
//设定阈值二值化
cvThreshold(gray_img,bin_img,threshold,255, CV_THRESH_BINARY );//threshold可以设到250-254

这就得到8位的bin_img了,你所要的区域是255,别的区域都是0。然后用FindContours函数就可以得到轮廓集了
[解决办法]
引用:
data.value表示的是对这个value代表的区域进行填充么? 
seed怎么处理? 

value是RGBA空间描述,其实就是RGB+A,A是透明度alpha
标号是你CvSeq链表内存的数据标号

seed是区域内种子点,你既然需要提取某个区域的轮廓,那你知道是哪个区域吧?
如果是要提取某个像素所在的区域,那就用cvfloodfill种子填充法
如果只是提取分割后某颜色(value)的区域,可以转为灰度后用两次cvThreshold来只保留你所要的区域,不过如果区域多的话可能会有同灰度区域;最好的是自己遍历下图像数据,将颜色不同的图像数据全置0然后转为灰度再用cvThreshold来获取所需区域
lpBits = (uchar*)img1->imageData;
for(int j=0;j<height;j++)
for(int i=0;i<width;i++)
..



热点排行