标记的独特轮廓(或绘制独立轮廓)

时间:2017-09-12 13:45:08

标签: python opencv label

我在python和opencv库中工作。

我可以对相机拍摄进行阈值处理,找到轮廓(不止一个)并绘制。 但我有一个问题。我尝试用唯一的id或标签识别那些轮廓。 (例如:Id:1,Id:2)跟踪它们。 我需要这个轮廓使用持久的id。

目标是绘制一条线并计算多个轮廓,有时多个近轮廓转换成一个大轮廓。

注意:我正在使用深度相机,我的图像是一个深度阵列。

添加一段代码。

提前致谢。

    countours = cv2.findContours(mask, cv2.RETR_EXTERNAL,
                                 cv2.CHAIN_APPROX_SIMPLE)[1]

    # only proceed if at least one contour was found
    if len(countours) > 0:
        # find the largest contour in the mask, then use
        # it to compute the minimum enclosing circle and
        # centroid

        for (i,c) in enumerate(countours):
            ((x, y), radius) = cv2.minEnclosingCircle(c)

            M = cv2.moments(c)
            if M["m00"] > 0:
                center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"]))
                centerString = str(center)
                x = (int(M["m10"] / M["m00"]))
                y = (int(M["m01"] / M["m00"]))
            else:
                center = int(x), int(y)




            if radius > 10:
                # draw the circle and centroid on the frame,
                cv2.circle(frame, (int(x), int(y)), int(radius),
                           (0, 255, 255), 2)
                cv2.circle(frame, center, 5, (0, 0, 255), -1)
                # then update the ponter trail
                if self.previous_position:
                    cv2.line(self.trail, self.previous_position, center,
                             (255, 255, 255), 2)
                    cv2.add(self.trail, frame, frame)
                    print center
    self.previous_position = center
    if len(countours) < 1:
        center = 0
        self.trail = numpy.zeros((self.cam_height, self.cam_width, 3),
                             numpy.uint8)
        self.previous_position = None

2 个答案:

答案 0 :(得分:0)

两个选项。首先,轮廓已经在Python列表中,因此该列表的索引可用于枚举它们。事实上,您已经在某种意义上使用(i,c) in enumerate(countours)执行此操作。您只需使用索引i即可获得颜色&#39;每个轮廓的值i绘制在空白图像上,然后您只需通过检查图像就可以知道哪个轮廓。另一个可能更好的选择IMO是使用cv2.connectedComponents()标记二进制图像而不是二进制图像的轮廓。同时预先标记您可以尝试morphological operations来关闭blob。

答案 1 :(得分:0)

编辑:我按照你的建议,我遇到了新问题:)

标签不是持久性的。当我移动两个轮廓时,标签的数量会发生变化。 添加一些图片和我的代码。

Hand label 0 and circle 1

Hand label 1 and circle 0

while True:

    cnt += 1
    if (cnt % 10) == 0:
        now = time.time()
        dt = now - last
        fps = 10/dt
        fps_smooth = (fps_smooth * smoothing) + (fps * (1.0-smoothing))
        last = now

    c = dev.color

    cad = dev.cad

    dev.wait_for_frames()

    c = cv2.cvtColor(c, cv2.COLOR_RGB2GRAY)
    depth = dev.depth * dev.depth_scale * 1000

    print depth

    #d = cv2.applyColorMap(depth.astype(np.uint8), cv2.COLORMAP_SUMMER)



    print depth


    res = np.float32(dev.depth)

    depth = 255 * np.logical_and(depth >= 100, depth <= 500)
    res2 = depth.astype(np.uint8)

    kernel = np.ones((3, 3), np.uint8)
    #res2 = cv2.blur(res2,(15,15))
    res2 = cv2.erode(res2, kernel, iterations=4)
    res2 = cv2.dilate(res2, kernel, iterations=8)

    im_floodfill = res2.copy()

    h, w = res2.shape[:2]
    mask2 = np.zeros((h + 2, w + 2), np.uint8)

    cv2.floodFill(im_floodfill, mask2, (0, 0), 255)

    im_floodfill_inv = cv2.bitwise_not(im_floodfill)

    im_out = res2 | im_floodfill_inv

    im_out = cv2.blur(im_out,(5,5))

    label = cv2.connectedComponentsWithStats(im_out)

    n = label[0] - 1
    cog = np.delete(label[3], 0, 0)

    for i in xrange(n):
        # im = cv2.circle(im,(int(cog[i][0]),int(cog[i][1])), 10, (0,0,255), -1)
        cv2.putText(im_out, str(i), (int(cog[i][0]), int(cog[i][1])), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)

    cv2.imshow("Depth", res)

    cv2.imshow("OUT", im_out)

    cv2.imshow( "C", res2)