ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python – ‘list(contour)’的结果是什么?

2019-08-26 15:07:21  阅读:307  来源: 互联网

标签:contour python opencv ipython


我只是试图理解轮廓的含义以及在OpenCV中使用cv.FindContours函数创建轮廓时存储的值是什么(我使用的是OpenCV 2.3.1和Python).我使用以下简单图像进行测试:

轮廓查找后,我在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对象.

我在图像上标记了这些点,这给了我下面的图像(红色标记的圆圈是点):

我不明白这是什么意思.

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

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

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接口而不是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)

因此,我们看到原始问题中列表(轮廓)的第一个轮廓是方形底部的小绿色条带,并且您获得的点对应于其顶点.

在矩形边缘和角落周围存在所有这些奇怪的微小轮廓的原因是因为(我猜)通过将图像保存为JPEG而引入的压缩伪像,这是有损的.如果您使用无损格式(例如PNG或TIFF)保存正方形,则只能通过矩形的角定义一个轮廓.

得到教训:

> cv.FindContours确实给出了每个轮廓的“顶点”
>你需要contours = contours.h_next()迭代每个轮廓
>如果你保存为JPEG期望人工制品!使用TIFF / PNG /无损的东西!

标签:contour,python,opencv,ipython
来源: https://codeday.me/bug/20190826/1731196.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有