我使用detectron2 来预测对象在图像中的位置。现在我正在尝试使用预测框来裁剪图像(在我的用例中,每个图像仅检测到 1 个对象/框)。与我的问题相关的代码部分如下。问题是它只裁剪图像的左侧,但我需要它(显然)裁剪顶部、右侧和底部,以便裁剪到检测到的对象的形状。原始图像的形状为 (x, y, 3),因此它们是 RGB 图像。我错过了什么?
from detectron2.utils.visualizer import ColorMode
import glob
imageName = "my_img.jpg"
im = cv2.imread(imageName)
outputs = predictor(im)
v = Visualizer(im[:, :, ::-1], metadata=test_metadata, scale=0.8)
out = v.draw_instance_predictions(outputs["instances"].to("cpu"))
cv2_imshow(out.get_image()[:, :, ::-1])
boxes = outputs["instances"].pred_boxes
boxes = list(boxes)[0].detach().cpu().numpy()
# extract the bounding box coordinates
(x, y) = (int(boxes[0]), int(boxes[1]))
(w, h) = (int(boxes[2]), int(boxes[3]))
crop_img = image[x:y+h, y:x+w]
cv2_imshow(crop_img)
我也尝试了以下方法,但它从顶部修剪了太多图像,根本没有修剪图像的右侧或底部。
from detectron2.data.transforms import CropTransform
ct = CropTransform(x, y, w, h)
crop_img = ct.apply_image(image)
cv2_imshow(crop_img)
玩弄它,我能够使用以下内容裁剪检测到的框周围的图像,但这并不理想,因为我必须对其进行硬编码。
crop_img = image[y-40:y+h-390, x:x+w-395]