Yolov8目标分割代码优化:解决重复创建掩码矩阵问题

在使用Yolov8进行目标分割时,您可能遇到过以下代码片段:

image = cv2.imread(image_path)  
mask_img = np.zeros_like(image)

for i, pixel_xy in enumerate(results[0].masks.xy):  
    
    #pixel_xy = result.masks.xy[i]
    points = np.array(pixel_xy, np.int32)
    mask_img = np.zeros_like(image)
    out_img = cv2.bitwise_and(image, mask_img, mask=points)
    cv2.imwrite('output_' + str(i) + '.jpg', out_img)

这段代码存在一个明显的错误:在每次迭代中都重新创建了一个全零矩阵mask_img,这会导致效率低下。

错误原因:

每次循环都重新创建mask_img意味着之前迭代的分割信息会被丢失,导致最终输出结果不完整。

解决方案:

以下代码展示了如何优化上述代码,仅在第一次迭代时创建mask_img,并在后续迭代中使用cv2.fillPoly函数对其进行更新:

image = cv2.imread(image_path)  
mask_img = np.zeros_like(image)

for i, pixel_xy in enumerate(results[0].masks.xy):  
    points = np.array(pixel_xy, np.int32)
    mask_img = cv2.fillPoly(mask_img, [points], (255, 255, 255))
    out_img = cv2.bitwise_and(image, mask_img)
    cv2.imwrite('output_' + str(i) + '.jpg', out_img)

解释:

  1. 首先,我们只在循环开始前创建了一个全零矩阵mask_img
  2. 然后,使用cv2.fillPoly函数将每个分割区域填充为白色。cv2.fillPoly函数会直接在mask_img上进行操作,不会重新创建新的矩阵。
  3. 在后续的迭代中,我们只需要使用cv2.bitwise_and函数将原始图像和更新后的mask_img进行按位与运算,即可得到分割结果。

通过以上优化,我们可以显著提高代码效率,避免重复创建mask_img,并确保所有分割结果都被完整地保存。

Yolov8目标分割代码优化:解决重复创建掩码矩阵问题

原文地址: http://www.cveoy.top/t/topic/03d 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录