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)
[解决办法]这个不是很简单吗?假设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函数就可以得到轮廓集了
[解决办法]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++)
..