gpt4 book ai didi

cvFindContours 没有产生我期望的输出

转载 作者:行者123 更新时间:2023-11-30 17:54:10 28 4
gpt4 key购买 nike

我有一个简单的、人为的示例,使用 cvFindContours 和 OpenCV C API 在二进制图像上查找连接的组件。 (这是用 C 编写的较大软件的一部分,因此不能选择使用 C++ API。)

示例输入图像由黑色背景上两个不重叠的填充白色方 block 组成。我希望从中得到两个轮廓,代表构成每个正方形周长的连接组件。相反,我得到了四个组件。为什么?详细信息如下。

首先,我将输入图像设置为“self”阈值,这是一个 CV_32FC1 图像,背景像素为 0.0,白色像素(两个方 block )值为 1.0:

cvThreshold(self, self, 0.8, 1.0, CV_THRESH_BINARY);

然后,我使用 cvScale 将输入图像复制到相同大小的 CV_32SC1 图像:

CvMat * temp = cvCreateMat(height, width, CV_32SC1);
cvConvertScale(self, temp, 1, 0);

然后我执行 cvFindContours 来获取连接的组件:

CvSeq * components = 0;
CvMemStorage * mem = cvCreateMemStorage(0);
cvFindContours(temp, mem, &components, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));

然后,我执行以下操作来输出构成轮廓的点并将它们绘制到窗口中。

for(; components != 0; components = components->h_next)
{
printf("===============NEW COMPONENT!============\n");
if (components->v_next) printf("This has a child.\n");
CvPoint * pt_array = (CvPoint *)malloc(components->total*sizeof(CvPoint));

cvCvtSeqToArray(components, pt_array, CV_WHOLE_SEQ);
for (int i = 0; i < components->total; i++)
{
printf("Point %i: %i, %i\n", i, pt_array[i].x, pt_array[i].y);
}
free(pt_array);
outer_color = CV_RGB(rand()%255, rand()%255, rand()%255);
cvDrawContours(dst, components, outer_color, inner_color, -3, 1, 8, cvPoint(0,0));
}

我希望这会产生两个轮廓,代表我的二值图像中两个白色方 block 的周长。相反,我得到了四个顶级轮廓,它们大约彼此重叠。给出了什么?

四个等高线中的点如下:

===============NEW COMPONENT!============
Point 0: 200, 150
Point 1: 200, 199
Point 2: 199, 200
Point 3: 150, 200
Point 4: 149, 199
Point 5: 149, 150
Point 6: 150, 149
Point 7: 199, 149
===============NEW COMPONENT!============
Point 0: 150, 150
Point 1: 150, 199
Point 2: 199, 199
Point 3: 199, 150
===============NEW COMPONENT!============
Point 0: 50, 10
Point 1: 50, 49
Point 2: 49, 50
Point 3: 10, 50
Point 4: 9, 49
Point 5: 9, 10
Point 6: 10, 9
Point 7: 49, 9
===============NEW COMPONENT!============
Point 0: 10, 10
Point 1: 10, 49
Point 2: 49, 49
Point 3: 49, 10

最佳答案

这是在黑暗中拍摄的,但我知道轮廓方法标志控制结果集结构。也许尝试将 CV_RETR_CCOMP 标志与描述的标志之一交换 here .

这个link解释一下标志 CV_RETR_CCOMP 的工作原理。

但这很奇怪,我也不希望你得到这样的结果。

关于cvFindContours 没有产生我期望的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15121050/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com