从多个阈值创建阈值阵列

时间:2019-05-17 12:14:26

标签: numpy opencv image-processing mask

我有一个深度学习模型,可以进行对象检测和分割。我想使用分割的数据来生成蒙版中心的x和y像素坐标。我发现当图像中仅可见一个对象时,函数cv2.threshold()对此非常有效。当我添加另一个对象时,阈值函数的结果将发生变化。我在findContours()中使用此结果。当检测到多个遮罩时,它们将同时通过。这使cv2认为编码已更改。

我尝试将阈值数组拆分为可用的数组,但是没有成功。我已经研究了一个和两个检测到的对象之间的差异,但是找不到逻辑相关性。

首先将相机图像传递到模型。结果“结果”被传递到center_mask。

 if msg is not None:
                np_image = self._cv_bridge.imgmsg_to_cv2(msg, 'mono8')
                np_image = cv2.merge((np_image, np_image, np_image))

                # Run detection
                results = self._model.detect([np_image], verbose=0)
                result = results[0]

                result_msg = self._build_result_msg(msg, result) #TODO
                self._result_pub.publish(result_msg)
                self._mask_pub.publish(self.center_mask(result))

                # Visualize results
                if self._visualization:
                    vis_image = self._visualize(result, np_image)
                    cv_result = np.zeros(shape=vis_image.shape, dtype=np.uint8)
                    cv2.convertScaleAbs(vis_image, cv_result)
                    image_msg = self._cv_bridge.cv2_to_imgmsg(cv_result, 'bgr8')
                    vis_pub.publish(image_msg)

            rate.sleep()

    def center_mask(self, result):
        centers = xyz()
        pt = Point()

        ret, thresh = cv2.threshold(result['masks'], 0, 1, 0)
        print("thresh", thresh)
        if thresh != []:
            for i in range(3):
                print("in for loop")
                #mask = thresh[0][:, i]
                #print(mask)
                #mask = np.reshape(mask, (len(mask), 1))
                #print(mask)
                im, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
                M = cv2.moments(contours[0])

                if(M["m10"] and M["m01"] and M["m00"]) != 0:
                    cX = int(M["m10"] / M["m00"])
                    cY = int(M["m01"] / M["m00"])
                    print("cx: ", cX)
                    print("cy:", cY)
                    pt.x = cX
                    pt.y = cY
                    pt.z = 0

                    centers.points.append(copy.deepcopy(pt))
                else:
                    print('no pot found else')
                    pt.x = 0
                    pt.y = 0
                    pt.z = 0
                    centers.points.append(copy.deepcopy(pt))

            return centers

图像中具有一个对象的结果阈值数组如下所示:

mask_rcnn: ('thresh', array([[0, 0, 0, ..., 0, 0, 0],
           mask_rcnn:        [0, 0, 0, ..., 0, 0, 0],
           mask_rcnn:        [0, 0, 0, ..., 0, 0, 0],
           mask_rcnn:        ...,
           mask_rcnn:        [0, 0, 0, ..., 0, 0, 0],
           mask_rcnn:        [0, 0, 0, ..., 0, 0, 0],
           mask_rcnn:        [0, 0, 0, ..., 0, 0, 0]], dtype=uint8)

得到的具有两个对象的脱粒阵列如下:

('thresh', array([[[0, 0],
           mask_rcnn:         [0, 0],
           mask_rcnn:         [0, 0],
           mask_rcnn:         ...,
           mask_rcnn:         [0, 0],
           mask_rcnn:         [0, 0],
           mask_rcnn:         [0, 0]],
           mask_rcnn: 
           mask_rcnn:        [[0, 0],
           mask_rcnn:         [0, 0],
           mask_rcnn:         [0, 0],
           mask_rcnn:         ...,
           mask_rcnn:         [0, 0],m
           mask_rcnn:         [0, 0],
           mask_rcnn:         [0, 0]],
           mask_rcnn: 
           mask_rcnn:        [[0, 0],
           mask_rcnn:         [0, 0],
           mask_rcnn:         [0, 0],
           mask_rcnn:         ...,
           mask_rcnn:         [0, 0],
           mask_rcnn:         [0, 0],
           mask_rcnn:         [0, 0]],
           mask_rcnn: 
           mask_rcnn:        ...,
           mask_rcnn: 
           mask_rcnn:        [[0, 0],
           mask_rcnn:         [0, 0],
           mask_rcnn:         [0, 0],
           mask_rcnn:         ...,
           mask_rcnn:         [0, 0],
           mask_rcnn:         [0, 0],
           mask_rcnn:         [0, 0]],
           mask_rcnn: 
           mask_rcnn:        [[0, 0],
           mask_rcnn:         [0, 0],
           mask_rcnn:         [0, 0],
           mask_rcnn:         ...,
           mask_rcnn:         [0, 0],
           mask_rcnn:         [0, 0],
           mask_rcnn:         [0, 0]],
           mask_rcnn: 
           mask_rcnn:        [[0, 0],
           mask_rcnn:         [0, 0],
           mask_rcnn:         [0, 0],
           mask_rcnn:         ...,
           mask_rcnn:         [0, 0],
           mask_rcnn:         [0, 0],
           mask_rcnn:         [0, 0]]], dtype=uint8))

递归拆分阈值数组以便将它们传递给findContours函数的正确方法是什么?

搜索更多之后,我发现两个数组之间存在关联。多个对象将两个列表放在一个对象仅放置一个int的位置。

因此,问题变成了如何重新构造阈值以仅包含有关一个对象的信息。 这意味着从每个列表中检索相同的元素,并将它们放置在多个单个数组中。因此,每个列表的第n个值都需要在其列表中执行,并放置在重叠列表中。这些列表中的每个元素都需要这样做。

是否有一个可以处理此问题的numpy函数?

0 个答案:

没有答案