使用Amazon的Rekognition,我使用以下方法从JSON响应中提取了感兴趣的边界框:
def __init__(self, image):
self.shape = image.shape
def bounding_box_convert(self, bounding_box):
xmin = int(bounding_box['Left'] * self.shape[1])
xmax = xmin + int(bounding_box['Width'] * self.shape[1])
ymin = int(bounding_box['Top'] * self.shape[0])
ymax = ymin + int(bounding_box['Height'] * self.shape[0])
return (xmin,ymin,xmax,ymax)
def polygon_convert(self, polygon):
pts = []
for p in polygon:
x = int(p['X'] * self.shape[1])
y = int(p['Y'] * self.shape[0])
pts.append( [x,y] )
return pts
def get_bounding_boxes(jsondata):
objectnames = ('Helmet','Hardhat')
bboxes = []
a = jsondata
if('Labels' in a):
for label in a['Labels']:
#-- skip over anything that isn't hardhat,helmet
if(label['Name'] in objectnames):
print('extracting {}'.format(label['Name']))
lbl = "{}: {:0.1f}%".format(label['Name'], label['Confidence'])
print(lbl)
for instance in label['Instances']:
coords = tmp.bounding_box_convert(instance['BoundingBox'])
bboxes.append(coords)
return bboxes
if __name__=='__main__':
imagefile = 'image011.jpg'
bgr_image = cv2.imread(imagefile)
tmp = Tmp(bgr_image)
jsonname = 'json_000'
fin = open(jsonname, 'r')
jsondata = json.load(fin)
bb = get_bounding_boxes(jsondata)
print(bb)
字符串
输出是边界框的列表:
[(865, 731, 1077, 906), (1874, 646, 2117, 824)]
型
我可以很容易地从列表中提取一个位置,并保存为一个新的图像,使用:
from PIL import Image
img = Image.open("image011.jpg")
area = (865, 731, 1077, 906)
cropped_img = img.crop(area)
cropped_img.save("cropped.jpg")
型
然而,我还没有找到一个很好的解决方案来使用“bb”列表输出从图像中裁剪和保存多个边界框。
我确实找到了一个从csv中提取信息的解决方案:Most efficient/quickest way to crop multiple bounding boxes in 1 image, over thousands of images?。
但是,我相信有一种比将边界框数据保存到CSV并阅读它更有效的方法。
我不是很擅长写自己的函数-所有的建议都非常感谢!
2条答案
按热度按时间np8igboo1#
假设你的边界框坐标是
x,y,w,h
的形式,你可以做ROI = image[y:y+h,x:x+w]
来裁剪。对于这个输入图像:的数据
使用来自how to get ROI Bounding Box Coordinates without Guess & Check的脚本获取
x,y,w,h
边界框坐标,以裁剪出这些ROI:的
我们只需遍历边界框列表并使用Numpy切片对其进行裁剪。提取的ROI:
的
这里有一个最小的例子:
字符串
cedebl8k2#
建议的解决方案很慢,因为这个操作可以矢量化。看起来,确实,一些流行的框架(Tensorflow,Torch)让用户进行这种预处理,而其他框架(参见MatLab的
bboxcrop
)。下面是我在自己的研究中使用的矢量化代码:字符串
这里有一个小演示。考虑一个简单的图像,中间有一个盒子
型
的数据
使用上面的实用程序,我们将它与4个作物的边界框一起沿着
型
输出:
最后,一个关于真实的世界数据的视觉上有吸引力的例子,注解的树。
之后:
的
还有一个full notebook