【问题标题】:Extracting separate images from YOLO bounding box coordinates从 YOLO 边界框坐标中提取单独的图像
【发布时间】:2020-07-20 05:43:21
【问题描述】:

我有一组图像及其对应的 YOLO 坐标。现在我想将这些 YOLO 坐标表示的对象提取到单独的图像中。

但这些坐标是浮点数,因此无法使用拼接。

这是一张图片Sample Image,对应的YOLO坐标是

labels = [0.536328, 0.5, 0.349219, 0.611111]

我读我的图片如下:

image = cv2.imread('frame0.jpg')

然后我想使用类似image[y:y+h,x:x+w] 的东西,就像我在类似问题中看到的那样。但是变量是浮动的,所以我尝试使用图像1280 x 720 的尺寸将它们转换为整数,如下所示:

object = [int(label[0]*720), int(label[1]*720), int(label[2]*1280), int(label[3]*1280)]
x,y,w,h = object

但它没有正确获取图像的一部分,正如您在此处看到的 extractedImage

这是我的训练数据集的一部分,所以我之前使用一些工具裁剪了这些部分,所以我的标签不会有任何错误。此外,所有图像都以这种方式错误裁剪,我已经显示了其中 1 个图像的输出。

提前非常感谢。任何建议都会非常有帮助!

【问题讨论】:

  • 可能很愚蠢的建议 - 您是否尝试过反转尺寸?如,而不是[y:y+h, x:x+w],尝试[y:y+w, x:x+h]?
  • 是的,也尝试过。没有正确裁剪图像!
  • 你可以在你的“对象”行中使用 x,y,w,h 吗?我认为您根据 x,y,w,h = 标签行混合了错误的值
  • 我实际上确实将object 值分配给了x,y,w,h。我已经更新了我的问题。
  • label 中的值代表 xmin,ymin,xmax,ymax?

标签: python image opencv machine-learning image-processing


【解决方案1】:

标签需要进行不同的标准化 - 因为x 和y 是相对于屏幕中心的,它们实际上分别乘以W/2 和H/2。此外,宽度和高度尺寸必须分别乘以 W 和 H - 它们目前都被 W (1280) 标准化。以下是我的解决方法:

import cv2
import matplotlib.pyplot as plt

label = [0.536328, 0.5, 0.349219, 0.611111]
img = cv2.imread('P6A4J.jpg')

H, W, _ = img.shape
object = [int(label[0]*W/2), int(label[1]*H/2), int(label[2]*W), int(label[3]*H)]

x,y,w,h = object
plt.subplot(1,2,1)
plt.imshow(img)
plt.subplot(1,2,2)
plt.imshow(img[y:y+h, x:x+w])
plt.show()


plt.show()

输出:

]1

希望这会有所帮助!

【讨论】:

  • 其实我稍微修改了你的代码如下:object = [int(label[0]*W), int(label[1]*H), int(label[2]*W), int(label[3]*H)]和plt.imshow(img[y-h//2:y+h//2, x-w//2:x+w//2]),但是我不知道为什么会这样,只是尝试了所有的组合。
  • 我认为它们在功能上可能是等效的。无论如何,很高兴听到一切正常!
猜你喜欢
  • 2021-04-04
  • 1970-01-01
  • 2021-08-29
  • 2021-08-01
  • 2017-11-16
  • 2022-08-16
  • 2021-09-03
  • 2018-08-13
  • 1970-01-01
相关资源
最近更新 更多