如何分割在OpenCV中检测到的轮廓?

时间:2019-06-18 17:05:01

标签: python arrays numpy opencv contour

我目前正在尝试在对阈值应用阈值后在样本映射中查找晶粒的轮廓。在图片中,您可以看到,如果这些晶粒彼此非常靠近,则它们将被检测为单个轮廓。因此,我试图在最薄的部分分割轮廓。但是我的主要问题是我不知道如何使用numpy数组来实际分割轮廓,以便结果是两个数组。 (由于声誉原因,我无法包含图片,我是新用户)

https://imgur.com/1dtI2BV

我试图创建一个函数,该函数可以传递cv2.findContours()找到的轮廓,以使用某些条件将其分割。我将彼此之间的距离进行比较,并通过两个因素对其进行过滤。基本上,我得到了应该发生分裂的两个点的两个索引(a和b)。现在,我希望将这些点之间的位置移动到新轮廓(数组?)并从旧轮廓中删除这些点。然后将两者都添加到新列表或数组中,结果等于cv2.findContour()。我想我的问题主要是不了解numpy类型(数组)的概念。

@RequestMapping(value = "/users", method = RequestMethod.POST, headers = "Accept=application/json")
public void Add(@RequestBody List<user> users) throws Exception {

 // Here I am iterating users and writing one by one to different message topic based on the type
 // if any error in the given user while writing to message topic I am storing that user in other DB


}

将结果传递到我的绘图函数(可以完美地绘制cv2.findContours()找到的轮廓)会导致错误:

错误:(-215:声明失败)函数'cv :: drawContours'中的npoints> 0

1 个答案:

答案 0 :(得分:0)

我已经修改了我的代码,现在看来可以运行了:

    if len(dists) > 0:
        dists = sorted(dists, key=lambda a: a[0])
        a = dists[0][1]
        b = dists[0][2]
        old = contour.copy()
        new = old[a:b]
        old1 = old[0:a]
        old2 = old[b:len(old)]
        old = np.concatenate((old1,old2))
        contours_new.append(old)
        contours_new.append(new)
    else:
        contours_new.append(contour)

我摆脱了对我不起作用的numpy.delete函数。