将坐标存储在 python 中的字典中

Store coordinates in a dictionary in python

从一组代码中,我得到了类似

的坐标输出
(448, 258)
(445, 362)
(426, 784)
(441, 496)

我需要将它们存储在字典中。我想在存储在字典中的坐标之后遍历字典的元素。此外,坐标不是恒定的,它们可能因一个文件而异(坐标的数量可能会发生变化,'x' 和 'y' 的值也会变化 )。所以它不应该被硬编码。如何使用 python 使其成为可能?我是菜鸟,请多指教

如果不可能,则坐标是从给出 x 和 y 输出的函数中获得的。我们可以由此形成坐标字典吗?

编辑:

我希望输出为 {(448, 258), (445, 362), (426, 784), (441, 496)} 另外,我是否能像我预期的那样得到输出,我是否可以像 for x in dict 那样循环遍历它?

代码如下

import numpy as np
import argparse
import time
import cv2
import os


ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="path to input image")
ap.add_argument("-y", "--yolo", required=True, help="base path to YOLO directory")
ap.add_argument("-c", "--confidence", type=float, default=0.5, help="minimum probability to filter weak detections")
ap.add_argument("-t", "--threshold", type=float, default=0.3, help="threshold when applying non-maxima suppression")
args = vars(ap.parse_args())
counts = dict()

labelsPath = os.path.sep.join([args["yolo"], "coco.names"])
LABELS = open(labelsPath).read().strip().split("\n")

np.random.seed(42)
COLORS = np.random.randint(0, 255, size=(len(LABELS), 3), dtype="uint8")
weightsPath = os.path.sep.join([args["yolo"], "yolov3.weights"])
configPath = os.path.sep.join([args["yolo"], "yolov3-320.cfg"])
print("[INFO] loading YOLO from disk...")
net = cv2.dnn.readNetFromDarknet(configPath, weightsPath)

image = cv2.imread(args["image"])
(H, W) = image.shape[:2]
ln = net.getLayerNames()
ln = [ln[i[0] - 1] for i in net.getUnconnectedOutLayers()]
blob = cv2.dnn.blobFromImage(image, 1 / 255.0, (416, 416), swapRB=True, crop=False)
net.setInput(blob)
start = time.time()
layerOutputs = net.forward(ln)
end = time.time()
print("[INFO] YOLO took {:.6f} seconds".format(end - start))

boxes = []
confidences = []
classIDs = []

for output in layerOutputs:
    for detection in output:
        scores = detection[5:]
        classID = np.argmax(scores)
        confidence = scores[classID]
        if confidence > args["confidence"]:
            box = detection[0:4] * np.array([W, H, W, H])
            (centerX, centerY, width, height) = box.astype("int")
            x = int(centerX - (width / 2))
            y = int(centerY - (height / 2))
            boxes.append([x, y, int(width), int(height)])
            confidences.append(float(confidence))
            classIDs.append(classID)

idxs = cv2.dnn.NMSBoxes(boxes, confidences, args["confidence"], args["threshold"])

if len(idxs) > 0:
    for i in idxs.flatten():
        (x, y) = (boxes[i][0], boxes[i][1])
        (w, h) = (boxes[i][2], boxes[i][3])
        color = [int(c) for c in COLORS[classIDs[i]]]
        rectangle = cv2.rectangle(image, (x, y), (x + w, y + h), color, 2)
        text = "{}: {:.4f}".format(LABELS[classIDs[i]], confidences[i])
        cv2.putText(image, text, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)

        x1= y+h
        y1= x+w
        coordinates = (x1,y1)
        print(coordinates)

我写了打印语句知道物体检测后产生的盒子的坐标

为了获取一个元组并将元素分离到一个字典中,这是可行的:

t = (440, 765)
dict = {}
print(dict)
dict[t[0]] = t[1]
print(dict)

输出为:

{}
{440: 765}

只要您一次只给它一个元组,并且 x 坐标的 none 是相同的,这应该可以工作。这可以重新组织成一个函数,如下所示:

def make_dict(tuple, dict):
     dict[tuple[0]] = tuple[1]

好的,我看到你只是在打印坐标。你需要边走边收,所以你还不如直接收成一个set():

out = set()
if len(idxs) > 0:
    for i in idxs.flatten():
        (x, y) = (boxes[i][0], boxes[i][1])
        (w, h) = (boxes[i][2], boxes[i][3])
        color = [int(c) for c in COLORS[classIDs[i]]]
        rectangle = cv2.rectangle(image, (x, y), (x + w, y + h), color, 2)
        text = "{}: {:.4f}".format(LABELS[classIDs[i]], confidences[i])
        cv2.putText(image, text, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)

        x1= y+h
        y1= x+w
        out.add( (x1,y1) )
print(out)