使用 Opencv 的省略号错误 python

Error in ellipses using Opencv python

我有一张输入图像,想在找到的所有轮廓上绘制椭圆。我正在使用 python-opencv 并收到以下错误。谁能帮我这个?我确实知道绘制椭圆,但不确定如何在图像中绘制每个检测到的对象。我是这个领域的新手,因此请原谅我提出愚蠢的问题。

OpenCV Error: Incorrect size of input array (There should be at least 5 points to fit the ellipse) in cv::fitEllipse, file 
C:\bld\opencv_1498171314629\work\opencv-3.2.0\modules\imgproc\src\shapedescr.cpp, line 358
Traceback (most recent call last):
File "D:/project/test.py", line 41, in <module>
ellipse = cv2.fitEllipse(contours[0])
cv2.error: C:\bld\opencv_1498171314629\work\opencv- 
3.2.0\modules\imgproc\src\shapedescr.cpp:358: error: (-201) There should be 
at least 5 points to fit the ellipse in function cv::fitEllipse

ellipse=cv2.fitEllipse(contours[0])你只拟合第一个轮廓,它少于 5 个点......你应该遍历所有轮廓并只绘制那些超过 5 分...

尝试这样的事情:

import numpy as np
import cv2

image=cv2.imread("cell.jpg")

grey=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) 
grey_hist=cv2.calcHist([grey],[0],None,[256],[0,256])
eq=cv2.equalizeHist(grey)
blurredA1=cv2.blur(eq,(3,3))

(T,thresh)=cv2.threshold(blurredA1,190,255,cv2.THRESH_BINARY)
im2, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)

if len(contours) != 0:
  for i in range(len(contours)):
    if len(contours[i]) >= 5:
      cv2.drawContours(thresh,contours,-1,(150,10,255),3)
      ellipse=cv2.fitEllipse(contours[0])
    else:
      # optional to "delete" the small contours
      cv2.drawContours(thresh,contours,-1,(0,0,0),-1)

cv2.imshow("Perfectlyfittedellipses",thresh)
cv2.waitKey(0)

如您所见,我遍历了所有轮廓并检查它是否大于 5。另外,我添加了一些东西来遮盖所有不够大的轮廓。

我不知道你的输入图像如何,所以这可能有效也可能无效。当您在查找轮廓函数中使用 cv2.RETR_EXTERNAL 时,它只会 returns 外部轮廓。相反,使用 'cv2.RETR_TREE'.

这将检索所有轮廓并重建嵌套轮廓的完整层次结构。有关文档,请参阅 here。您的代码应更改如下。

im2, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

希望这对您有所帮助。如果它不起作用,如果您可以上传您的输入图像,以便我们可以处理它,那就太好了!

此外,关于在找到的每个轮廓上放置一个椭圆,就像提到的 api55 一样,您只是尝试在第一个轮廓上拟合椭圆。希望他的回答能帮到你。如果要在最大的轮廓上放置一个椭圆,可以将找到的轮廓按面积排序,然后在最大的轮廓或大于一定尺寸的轮廓上拟合椭圆。