将坐标存储在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)

我已经写了打印声明,以了解物体检测后产生的盒子的坐标。

好的,我看到你只是在打印坐标。你需要边走边收集它们,所以你也可以直接将它们收集到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)

为了取一个元组并将元素分离为dict,这是可行的:

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

输出为:

{}
{440: 765}

只要一次只给它一个元组,并且x坐标都不相同,这就应该有效。这可以重新组织成这样的功能:

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

最新更新