Создание массива thresh из нескольких порогов - PullRequest
0 голосов
/ 17 мая 2019

У меня есть модель глубокого обучения, которая выполняет обнаружение и сегментацию объектов.Я хочу использовать сегментированные данные для получения 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))

Каков был бы правильный способ рекурсивного разделения массива thresh, чтобы я мог передать их в функцию findContours?

После поиска я нашел корреляцию между двумя массивами.Несколько объектов помещает список из двух в позицию, где с одним объектом будет помещен только int.

Поэтому вопрос изменился на то, как реконструировать порог, чтобы он содержал информацию только об одном объекте.Это означает извлечение одного и того же элемента из каждого списка и размещение их в нескольких отдельных массивах.Таким образом, n-е значение каждого списка должно быть вынесено из его списка и помещено в наложенный список.Это должно происходить для каждого элемента этих списков.

Есть ли функция numpy, которая справится с этим?

...