我有一个深度学习模型,可以进行对象检测和分割。我想使用分割的数据来生成蒙版中心的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函数?