“列表(轮廓)”的结果表示什么?

2024-07-02 13:44:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我只是想了解轮廓的含义,当我们使用个人简历函数(我使用的是OpenCV 2.3.1和Python)。我用以下简单的图像进行测试:

enter image description here

在找到轮廓后,我在ipython中应用了以下命令:

In [8]: contour
Out[8]: <cv2.cv.cvseq at 0x90a31a0>

In [10]: list(contour)
Out[10]: 
 [(256, 190),
  (255, 191),
  (112, 191),
  (255, 191),
  (256, 190),
  (257, 191),
  (257, 190)]

第一个命令说,contour是一个cvSeq对象。在

我在图像上标记了这些点,如下所示(红色圆圈为点):

enter image description here

我不明白这是什么意思。在

所以我的问题是第二个命令(即list(contour))结果中的值表示什么?在


编辑:下面是我使用的代码。在

^{pr2}$

Tags: 函数in图像命令ipythonoutcv2opencv
2条回答

好的,我看了你的照片,你得到了每个区域的顶点。我花了一段时间来解决这个问题,因为我使用的是cv2接口,而不是cv接口。在

几件事:

  • 您的输入图像simple.jpeg中除了0和255之外还有多个灰度值,很可能是由于jpeg压缩。在
  • 因此,对于不同的灰度级,您可以从您的FindContours中得到多个区域。在
  • cv.FindContours返回多个链接序列,您必须迭代以获得所有的econtours。在
  • 你为你的例子得到的轮廓是一个边界轮廓。在

为了演示,让我们画出所有的轮廓。在

contours = cv.FindContours(imgg,storage,cv.CV_RETR_TREE,cv.CV_CHAIN_APPROX_SIMPLE,(0,0))
colours = [ (0,255,0,0),   # green
            (255,0,0,0),   # blue
            (255,255,0,0), # cyan
            (0,255,255,0), # yellow
            (255,0,255,0), # magenta
            (0,0,255,0)]   # red 
i=0
while contours:
    cv.DrawContours(img, contours, colours[i], colours[i], 0, thickness=-1)
    i = (i+1) % len(colours)
    contours = contours.h_next() # go to next contour
cv.ShowImage('img',img)
cv.WaitKey(0)

contours drawn

所以我们看到,在你最初的问题中,list(contours)的第一个轮廓是正方形底部的一条绿色小条带,你得到的点对应于它的顶点。在

在矩形的边缘和角落里有这么多奇怪的小轮廓是因为(我猜)压缩伪影是通过将图像保存为JPEG而引入的,这是有损的。如果你用无损格式(比如PNG或TIFF)保存正方形,你只会得到一个由矩形的角定义的轮廓。在

经验教训:

  • cv.FindContours是否给出每个轮廓的“顶点”
  • 您需要contours = contours.h_next()迭代每个轮廓
  • 如果您保存为JPEG,请期待人工制品!改用TIFF/PNG/一些无损的东西!在

我在list(contour)的输出上做了更多的工作,以便根据上面提供的答案了解轮廓数学。咖啡. 在

1)我的测试图像出错了。我以为这是一个二值图像,而实际上它是一个灰度图像和一些其他颜色。(感谢数学。咖啡). 所以我只测试了一张黑白图像。这一次,list(contour)给出了4个值的结果,当在图像上绘制时,这些值是方框的四个角。在

New output of image in question

所以当我们使用等高线等高线'函数,绘制连接所有这些顶点的线。所以我假设个人简历存储轮廓顶点的位置,该轮廓实际上是一个多边形。在

2)为了再次测试,我拍摄了另一张T形图像。在

test-image-2

为此,我希望有8个值的列表,它们是T的8个角

Output of image 2

“list(contour)”打印以下包含10个值的列表。(2个额外值可能是由于我的图纸错误)

[(92, 58), (92, 108), (174, 108), (175, 109), (175, 239), (225, 239), (225, 109), (226, 108), (285, 108), (285, 58)]

这意味着个人简历创建cvseq对象。里面存储着我上面假设的值。在

3)以上示例只找到一个轮廓。当发现多个等高线时,会出现什么情况?我没有清楚地理解多重连锁序列的概念数学。咖啡. 为了验证这一点,我拍了第三张照片。在

test image 3

现在个人简历找到三个轮廓。记住,每个轮廓都是由四个角组成的。这三个列表存储在一个cvseq对象中,指针仅指向第一个轮廓,即仅第一个框的顶点列表。所以用上面的代码,只画一个盒子的角。在

为了得到第二个顶点的列表,我们使用contour.h_next函数(感谢数学。咖啡,直到现在我才知道它的功能)。现在它指向第二个盒子的轮廓。因此,我们遍历其中的所有列表。在

所以我添加了一个简单的while循环,如下所示:

^{pr2}$

我有三张单子对应着三个盒子的角:

[(196, 237), (196, 279), (357, 279), (357, 237)]
[(141, 136), (141, 201), (346, 201), (346, 136)]
[(33, 39), (33, 92), (206, 92), (206, 39)]

以及输出图像:

Output of image 3

所以你可以预期一个圆的输出是什么,“它有大量的顶点”。在

现在一切都很简单了。我无法掌握轮廓值。这就是为什么,这么混乱。谢谢。在

更新-1:

关于新的cv2模块中轮廓的更多详细信息如下:Contours -1 : Getting Started

更新-2:

对于cv2,所有这些解释都是正确的。链条大约是\u简单。但是如果我们使用cv2.CHAIN_approach_NONE,我们会得到轮廓上的所有点。本文通过示例详细解释了这一点:Contours - 5 : Hierarchy

相关问题 更多 >