我在Windows 8.1上使用OpenCV 2.4.11和Python 2.7.9。我试图将椭圆放在我的轮廓上,我遇到了一些我无法弄清楚的东西。
当我调用cv2.fitEllipse并获取返回值,然后使用以下代码将返回值直接传递给cv2.ellipse时,绘制到屏幕上的省略号是完美的,并且最适合我的轮廓:
contours, hierarchy = cv2.findContours(binaryimage,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
for ind, cont in enumerate(contours):
elps = cv2.fitEllipse(cont)
#Feed elps directly into cv2.ellipse
cv2.ellipse(displayframe,elps,(0,0,255))
cv2.imshow("Perfectly fitted ellipses", displayframe)
以上结果是
但是,当我尝试解析实际的椭圆参数并通过传递这些参数手动绘制椭圆时(参见下面的代码),它会创建一个椭圆形的“臃肿”版本,让自己非常舒服(但很烦人)轮廓周围的空间支架,如下:
contours, hierarchy = cv2.findContours(binaryimage,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
for ind, cont in enumerate(contours):
(x,y),(MA,ma),angle = cv2.fitEllipse(cont)
#feed the parsed parameters into cv2.ellipse
cv2.ellipse(displayframe,(x,y),(MA, ma),angle,0,360,(0,0,255))
cv2.imshow("Ellipses NOT fitting the contours properly",displayframe)
这种烦人现象的结果是:
是的,我知道使用第一种方法可以解决问题绘制正确的省略号。但是我想知道它为什么要这样做,因为实际上,我需要椭圆的参数才能进行一些blob跟踪,如果解析的参数最终给出了这样宽泛的不适合的省略号,它真的吗准确?是否有cv2.ellipse()绘图功能的问题?什么是错误的任何想法?来自cv2.fitEllipse函数的椭圆参数是否准确?
答案 0 :(得分:4)
您正在绘制返回的边界框的宽度和高度。您应绘制一半宽度和高度,因为椭圆的轴将是其边界框的一半宽度和高度
cv2.ellipse(displayframe,(x,y),(MA/2, ma/2),angle,0,360,(0,0,255))