Изменения приемлемости кодирования изображения во время выполнения

У меня есть камера, которая передает данные в модель глубокого обучения. Эта модель оценивает изображения и возвращает найденные объекты. Программа работает нормально некоторое время и из ниоткуда закрывается.

           mask_rcnn: Traceback (most recent call last):
           mask_rcnn:   File "/home/riwo-rack-pc/GIT/automatic-planthandling/Ros/catkin_ws/src/image_processing/mask_rcnn_ros/nodes/mask_rcnn_node", line 227, in <module>
           mask_rcnn:     main()
           mask_rcnn:   File "/home/riwo-rack-pc/GIT/automatic-planthandling/Ros/catkin_ws/src/image_processing/mask_rcnn_ros/nodes/mask_rcnn_node", line 224, in main
           mask_rcnn:     node.run()
           mask_rcnn:   File "/home/riwo-rack-pc/GIT/automatic-planthandling/Ros/catkin_ws/src/image_processing/mask_rcnn_ros/nodes/mask_rcnn_node", line 114, in run
           mask_rcnn:     self._mask_pub.publish(self.center_mask(result))
           mask_rcnn:   File "/home/riwo-rack-pc/GIT/automatic-planthandling/Ros/catkin_ws/src/image_processing/mask_rcnn_ros/nodes/mask_rcnn_node", line 133, in center_mask
           mask_rcnn:     im, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
           mask_rcnn: cv2.error: /tmp/binarydeb/ros-kinetic-opencv3-3.3.1/modules/imgproc/src/contours.cpp:199: error: (-210) [Start]FindContours supports only CV_8UC1 images when mode != CV_RETR_FLOODFILL otherwise supports CV_32SC1 images only in function cvStartFindContours_Impl

Я изучил разницу в кодировке и возможностях для преобразования mono8 в требуемый CV_8UC1. Казалось, что вывод заключается в том, что они более или менее одинаковы.

        rate = rospy.Rate(self._publish_rate)
        while not rospy.is_shutdown():
            if self._msg_lock.acquire(False):
                msg = self._last_msg
                self._last_msg = None
                self._msg_lock.release()
            else:
                rate.sleep()
                continue

            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, 255, 0)
            #
        im, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
        if(contours != []):
            for c in contours:
                print("in the forloop met contouren")
                M = cv2.moments(c)

                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

Я ожидаю, что код продолжит работать, пока я не остановлю его, и я ожидаю, что кодирование сообщения, которое я оцениваю, не изменится без видимой причины.

Есть ли функция, которая может преобразовать это, или есть возможность проверить кодировку перед передачей в функцию findContours?

Всего 1 ответ


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


Есть идеи?

10000