gpt4 book ai didi

python - 'list(contour)' 的结果表示什么?

转载 作者:太空宇宙 更新时间:2023-11-03 13:50:58 26 4
gpt4 key购买 nike

我只是想了解轮廓的含义以及当我们在 OpenCV 中使用 cv.FindContours 函数创建轮廓时存储的值是什么(我使用的是 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))的结果中的值表示什么?


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

import cv
img = cv.LoadImage('simple.jpeg')
imgg = cv.LoadImage('simple.jpeg',cv.CV_LOAD_IMAGE_GRAYSCALE)
storage = cv.CreateMemStorage(0)
contours = cv.FindContours(imgg,storage,cv.CV_RETR_TREE,cv.CV_CHAIN_APPROX_SIMPLE,(0,0))
print list(contours)
for i in list(contours):
cv.Circle(img,i,5,(0,0,255),1)
cv.ShowImage('img',img)
cv.WaitKey(0)

最佳答案

好的,我看过你的图片,你正在获取每个区域的顶点。我花了一段时间才弄明白,因为我使用的是 cv2 接口(interface),而不是 cv 接口(interface)。

一些事情:

  • 您的输入图像 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/无损文件!

关于python - 'list(contour)' 的结果表示什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9060254/

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