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