【问题】
在使用SAM2分割图片的时候,想要把mask保存下来,于是使用下列代码
masks, scores, logits = predictor.predict(
point_coords=input_point,
point_labels=input_label,
multimask_output=True,
)
sorted_ind = np.argsort(scores)[::-1]
masks = masks[sorted_ind]
cv2.imwrite('./test.jpg', masks*255)
(除了最后一行,其他都是截取自SAM2官方文档)
结果是没有报错,图片也没有保存下来
【分析】
v = cv2.imwrite('./test.jpg', masks*255)
print(v)
用上面的代码打印出imwrite的返回值,发现是False
一般有两种原因,一是路径错误,二是图像格式不对。这里路径显然是没有问题的,那么问题应该就出在masks的格式上。
启动调试,查看masks变量,发现它是numpy ndarray格式(符合opencv的要求),size为[3, 1200, 1800],对应[C, H, W],这就是问题所在,因为opencv保存时图像尺寸要求为[H, W, C],所以只要对masks做一下变换就可以了。操作如下。
【解决方法】
masks = masks[sorted_ind]
masks_cv2 = np.transpose(masks, (1, 2, 0))
cv2.imwrite('./test.jpg', masks_cv2*255)
在保存前使用np.transpose对masks进行处理,交换不同维度的顺序,调整为[H, W, C]即可
再次运行就成功保存了mask图片