我想在简单的填充形状上得到封闭的圆圈。我正在使用opencv和python。我使用minEnclosingCircle函数。但是在某些例子中,我得到了奇怪的结果:
中心应该以形状为中心,圆形应该接触形状。显然情况并非如此。
有趣的是,旋转90°的相同图片的中心不一样。它的移动程度较低。旋转没有理由改变最小包围圆的中心。这意味着这个功能被窃听,我需要一个替代方案。我只需要圆圈的中心。
以下是我的代码的小版本:
import cv2
import numpy as np
img = cv2.imread('testodd3.jpg',cv2.CV_LOAD_IMAGE_COLOR)
pic = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(pic,127,255,0)
thresh = cv2.bitwise_not(thresh)
contours,hierarchy = cv2.findContours(thresh, 1, 2)
cnt = contours[0]
(x,y),radius = cv2.minEnclosingCircle(cnt)
center = (int(x),int(y))
radius = int(radius)
cv2.circle(img,center,radius,(0,255,0),3)
cv2.circle(img,center,3,(255,255,0),3)
cv2.drawContours(img, [cnt], 0, (0,0,255), 3)
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
我看到了类似的问题,但解决方案使用的是C ++库:Unexpected results of minEnclosingCircle in OpenCV
答案 0 :(得分:0)
我使用的opencv版本是2.4.13.2_2(此时Mac上的最新自制版本)。实施似乎破了:https://github.com/opencv/opencv/issues/6438
Opencv 3.3使用另一种实现,工作正常。
这是一个简单的代码:
import cv2
import numpy as np
img = cv2.imread('testodd7.jpg',cv2.IMREAD_GRAYSCALE)
ret,thresh = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
img,contours,hierarchy = cv2.findContours(thresh, 1, 2)
cnt = contours[0]
(x,y),radius = cv2.minEnclosingCircle(cnt)
center = (int(x),int(y))
radius = int(radius)
img2 = cv2.imread('testodd7.jpg',cv2.IMREAD_COLOR)
cv2.circle(img2,center,radius,(0,255,0),3)
cv2.circle(img2,center,3,(255,255,0),3)
cv2.drawContours(img2, [cnt], 0, (0,0,255), 3)
cv2.imshow('image',img2)
cv2.waitKey(0)
cv2.destroyAllWindows()