как l oop через draw.rectangle в подушке python? - PullRequest
0 голосов
/ 24 марта 2020

Я хочу получить координаты лица из файла JSON, который выглядит следующим образом:

#Beginning PART OF JSON FILE
{
    "image": {
        "height": 2160,
        "orientation": 1,
        "width": 3840
    },
    "objects": [
        {
            "boundingBox": {
                "height": 1152,
                "width": 1048,
                "x": 0,
                "y": 977
            },
            "type": "person"
        },
        {
            "boundingBox": {
                "height": 1305,
                "width": 486,
                "x": 1096,
                "y": 852
            },
            "type": "person"
        },...
....

PYTHON КОД:

import PIL
import json
from PIL import Image, ImageDraw

with open('facecoordinates.json','r') as f:
    data = json.load(f)

height = d["objects"] [0] ["boundingBox"] ["height"]
width = d["objects"] [0] ["boundingBox"] ["width"]
xx = d["objects"] [0] ["boundingBox"] ["x"]
yy = d["objects"] [0] ["boundingBox"] ["y"]

image = Image.open('vlcsnap.png')


imgcp = image.copy()
imgcp_draw = ImageDraw.Draw(imgcp)


imgcp_draw.rectangle([xx,yy,(width+xx),(yy+height)], fill = None, outline = "red")

imgcp.save('DC1.jpg')
imgcp.show()

Мне удалось получить первые координаты из файла JSON и сопоставьте лицо, но я хочу знать, как пройти через l oop и передать все координаты лица, чтобы нарисовать прямоугольники на изображении.

я пытаюсь провести через них l oop в Pillow.DRAW.RECTANGLE в качестве координат для рисования прямоугольника на изображении.

Я изо всех сил пытался обойти петли, и это всегда неправильно. какие-либо предложения?

1 Ответ

2 голосов
/ 24 марта 2020

Вы должны исправить способ ввода координат в Pillow.DRAW.RECTANGLE.

Ваш код будет выглядеть следующим образом:

list=data['objects']

# After following Mark's edit

coords_list = [] 
for i in list: 
   coords = [] 
   coords.append(i['boundingBox']['x']) 
   coords.append(i['boundingBox']['y']) 
   coords.append(i['boundingBox']['x'] + i['boundingBox']['width']) 
   coords.append(i['boundingBox']['y'] + i['boundingBox']['height']) 
   coords_list.append(coords) 

image = Image.open('vlcsnap.png')
imgcp = image.copy()
imgcp_draw = ImageDraw.Draw(imgcp)

for coord in  coords_list:
     imgcp_draw.rectangle(coord, fill = None, outline = "red")

imgcp.save('DC1.jpg')
imgcp.show()

Отредактировано Марком Сетчеллом за пределами эта точка

Функции draw() принимают x0,y0,x1,y1, а не ширину и высоту, поэтому вам нужен код, подобный этому.

coords_list = [] 
for i in list: 
   coords = [] 
   coords.append(i['boundingBox']['x']) 
   coords.append(i['boundingBox']['y']) 
   coords.append(i['boundingBox']['x'] + i['boundingBox']['width']) 
   coords.append(i['boundingBox']['y'] + i['boundingBox']['height']) 
   coords_list.append(coords) 
...