我在检测圆形区域时遇到问题。我用opencv的HoughCircles函数试过了。然而,即使图像非常相似,函数的参数也必须不同才能检测到圆圈。
我尝试的另一种方法是遍历每个像素并检查当前像素是否为白色。如果是这种情况,则检查该区域中是否存在 blob 对象(到 blob 中心的距离小于阈值)。如果有,将像素附加到 blob,如果没有,则创建一个新 blob。这也无法正常工作。
有谁知道我怎样才能完成这项工作(90% 检测)?我附上了一个示例图像和另一个我标记了圆圈的图像。谢谢!
更新: 感谢您到目前为止的帮助!这是我获取轮廓并按区域过滤它们的代码:
im = cv2.imread('extract_blue.jpg')
imgray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
im_gauss = cv2.GaussianBlur(imgray, (5, 5), 0)
ret, thresh = cv2.threshold(im_gauss, 127, 255, 0)
# get contours
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours_area = []
# calculate area and filter into new array
for con in contours:
area = cv2.contourArea(con)
if 1000 < area < 10000:
contours_area.append(con)
这是我按循环过滤的部分,它直接位于我按区域过滤的代码下方:
contours_cirles = []
# check if contour is of circular shape
for con in contours_area:
perimeter = cv2.arcLength(con, True)
area = cv2.contourArea(con)
if perimeter == 0:
break
circularity = 4*math.pi*(area/perimeter*perimeter)
print circularity
if 0.8 < circularity < 1.2:
contours_cirles.append(con)
但是,新列表“contours_cirles”是空的。我在循环中打印了“圆度”,值都在 10 000 到 100 000 之间。
更新#2: 纠正丢失的括号后,它现在可以工作了!
contours_cirles = []
# check if contour is of circular shape
for con in contours_area:
perimeter = cv2.arcLength(con, True)
area = cv2.contourArea(con)
if perimeter == 0:
break
circularity = 4*math.pi*(area/(perimeter*perimeter))
print circularity
if 0.7 < circularity < 1.2:
contours_cirles.append(con)
非常感谢你们!:)