суть кода такова: я делю изображение на несколько зон разного размера и распознаю определённые объекты в этих зонах. Код работает, но через некоторое время выдаёт следующую ошибку: File "c:\programs\zony.py", line 40, in
class_name = classNames[class_id]
KeyError: 18.
может кто знает как бороться с ней?
import cv2
import numpy as np
import os
# Задаем количество и размеры зон
num_zones = 4
zone_width = 320
zone_height = 240
zone_width2 = 120
zone_height3 = 135
classNames = { 1: 'bicycle', 2: 'bus', 3: 'car', 4: 'chair',
5: 'motorbike', 6: 'person',
7: 'pottedplant', 8: 'train', }
model = cv2.dnn.readNetFromCaffe('C:\programs\Real\MobileNetSSD_deploy.prototxt.txt', 'C:\programs\Real\MobileNetSSD_deploy.caffemodel')
# Создаем объект для видео
cap = cv2.VideoCapture(0)
while True:
# Считываем кадр из видео
ret, frame = cap.read()
# Разделяем кадр на зоны
for i in range(num_zones):
# Вычисляем координаты верхнего левого угла зоны
x = (i % 2) * zone_width
y = (i // 2) * zone_height
# Получаем изображение зоны
zone = frame[y:y+zone_height, x:x+zone_width]
# Отображаем изображение зоны
frame_resized = cv2.resize(zone, (300, 300))
blob = cv2.dnn.blobFromImage(frame_resized, 0.007843, (300, 300), (127.5, 127.5, 127.5), False)
model.setInput(blob)
detections = model.forward()
for i in range(detections.shape[2]):
confidence = detections[0, 0, i, 2]
if confidence > 0.5:
class_id = int(detections[0, 0, i, 1])
class_name = classNames[class_id]
box = detections[0, 0, i, 3:7] * np.array([frame.shape[1], frame.shape[0], frame.shape[1], frame.shape[0]])
x1, y1, x2, y2 = box.astype('int')
cv2.rectangle(zone, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.putText(zone, class_name, (x1, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
cv2.imshow("Z1", zone)
# Отображаем исходный кадр
for i in range(num_zones):
# Вычисляем координаты верхнего левого угла зоны
x = (i % 2) * zone_width2
y = (i // 2) * zone_height3
# Получаем изображение зоны
zone2 = frame[y:y+zone_height3, x:x+zone_width2]
# Отображаем изображение зоны
cv2.imshow("Z2", zone2)
# Если нажата клавиша 'q', выходим из цикла
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# Освобождаем ресурсы
cap.release()
cv2.destroyAllWindows()