opencv 如何使用AWS Rekognition返回带有边界框的图像?

rdlzhqv9  于 2023-08-06  发布在  其他
关注(0)|答案(2)|浏览(114)

当我将图像上传到s3存储桶并调用AWS Rekognition detect_labels时,我将获得如下所示的检测到的标签的字典

'标签':【名称】:【植物】,【信心】:99.70314025878906,'示例':[],'Parents':[]},'Name':“花”、“自信”:98.37027740478516,'示例':[],'Parents':['Name':'Plant'}]}

但这里我需要返回的图像与边界框的对象是确定的,这是如何实现的?

7vhp5slm

7vhp5slm1#

您必须使用rekognition.detect_labels方法对图像执行对象检测。然后可以使用Labels列表的BoundingBox属性来获取边界框的坐标,下面的代码可以是一个很好的开始。

import boto3
import io
from PIL import Image, ImageDraw, ImageFont

file_name = 'plant.jpg'
# Get Rekognition client
rek_client = boto3.client('rekognition')
with open(file_name, 'rb') as im:
    # Read image bytes
    im_bytes = im.read()
    # Upload image to AWS 
    response = rek_client.detect_labels(Image={'Bytes': im_bytes})
    # Get default font to draw texts
    image = Image.open(io.BytesIO(im_bytes))
    font = ImageFont.truetype('arial.ttf', size=80)
    draw = ImageDraw.Draw(image)
    # Get all labels
    w, h = image.size
    for label in response['Labels']:
        name = label['Name']
        # Draw all instancex box, if any
        for instance in label['Instances']:
            bbox = instance['BoundingBox']
            x0 = int(bbox['Left'] * w) 
            y0 = int(bbox['Top'] * h)
            x1 = x0 + int(bbox['Width'] * w)
            y1 = y0 + int(bbox['Height'] * h)
            draw.rectangle([x0, y0, x1, y1], outline=(255, 0, 0), width=10)
            draw.text((x0, y1), name, font=font, fill=(255, 0, 0))

    image.save('labels.jpg')

字符串

b91juud3

b91juud32#

DetectLabels API documentation
DetectLabels返回Instance对象数组中common对象标签示例的边界框。Instance对象包含一个BoundingBox对象,用于表示图像上标签的位置。它还包括检测边界框的置信度。
这在Detecting labels documentation中有详细说明
Amazon Rekognition Image和Amazon Rekognition Video可以返回汽车、家具、服装或宠物等常见对象标签的边界框。不为不太常见的对象标签返回边界框信息。您可以使用边界框来查找图像中对象的确切位置,计算检测到的对象的示例数,或使用边界框尺寸来测量对象的大小。
简而言之,并非所有标签都返回边界框信息。@Allan Chua的代码仅当标签是具有边界框信息的“常见对象”时才会在图像中绘制边界框。在您提供的示例API响应中,所有标签都没有边界框信息。

相关问题