<p>好的,我看了你的照片,你得到了每个区域的顶点。我花了一段时间来解决这个问题,因为我使用的是<code>cv2</code>接口,而不是<code>cv</code>接口。在</p>
<p>几件事:</p>
<ul>
<li>您的输入图像<code>simple.jpeg</code>中除了0和255之外还有多个灰度值,很可能是由于jpeg压缩。在</li>
<li>因此,对于不同的灰度级,您可以从您的<code>FindContours</code>中得到多个<em>区域。在</li>
<li><code>cv.FindContours</code>返回<em>多个链接序列</em>,您必须<em>迭代</em>以获得所有的econtours。在</li>
<li>你为你的例子得到的轮廓是一个边界轮廓。在</li>
</ul>
<p>为了演示,让我们画出所有的轮廓。在</p>
<pre><code>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)
</code></pre>
<p><img src="https://i.stack.imgur.com/ArhZm.png" alt="contours drawn"/></p>
<p>所以我们看到,在你最初的问题中,<code>list(contours)</code>的第一个轮廓是正方形底部的一条绿色小条带,你得到的点对应于它的顶点。在</p>
<p>在矩形的边缘和角落里有这么多奇怪的小轮廓是因为(我猜)压缩伪影是通过将图像保存为JPEG而引入的,这是有损的。如果你用无损格式(比如PNG或TIFF)保存正方形,你只会得到一个由矩形的角定义的轮廓。在</p>
<p>经验教训:</p>
<ul>
<li><code>cv.FindContours</code><em>是否给出每个轮廓的“顶点”</li>
<li>您需要<code>contours = contours.h_next()</code>迭代每个轮廓</li>
<li>如果您保存为JPEG,请期待人工制品!改用TIFF/PNG/一些无损的东西!在</li>
</ul>