пытаюсь понять, что вызывает это исключение ключевой ошибки

#python

#python

Вопрос:

Для моего обучения и разработки я решил изучить prgramming и решил изучить python, я начал с приложения для проверки цвета, используя следующий учебник

Однако всякий раз, когда я запускаю команду actiavtion для открытия моего изображения, я получаю следующую ошибку

 Traceback (most recent call last):
  File "main.py", line 14, in <module>
    PathToImage = args['colour_select']
KeyError: 'colour_select'
  

Я относительно новичок в Python, поэтому это может быть не единственная ошибка в моем коде. Я в основном смущен тем, как это происходит.

Мой код полный код:

 # imports
import cv2
import numpy as np
import pandas as pd
import argparse

# variable declaration
clicked = False
red = blue = green = xpos = ypos = 0

ap = argparse.ArgumentParser()
ap.add_argument('-i', required=True, help="PathToImage")
args = vars(ap.parse_args())
PathToImage = args['colour_select']

img = cv2.imread(PathToImage)

# read csv file
index = ["colour", "colour_name", "hex", "R", "G", "B"]
csv = pd.read('colours.csv', names=index, header=None)

cv2.namedWindow('colour_select')
cv2.setMouseCallback('colour_select', draw_function)


def draw_function(event, x, y, flags, parameters):
    if event == cv2.EVENT_LBUTTONDBLCLK:
        global blue, green, red, xpos, ypos, clicked
        clicked = True
        xpos = x
        ypos = y
        blue, green, red = img[x, y]
        blue = int(blue)
        green = int(green)
        red = int(red)


def getColourName(red, green, blue):
    minimum = 10000
    for i in range(len(csv)):
        distance = abs(red - int(csv.loc[i, "Red"]))   abs(green - int(csv.loc[i, "Green"]))   abs(
            blue - int(csv.loc[i, "Blue"]))
        if (distance <= minimum):
            minimum = distance
            ColourName = csv.loc[i, "colour_name"]
        return ColourName


while (1):
    cv2.imshow("colour_select", img)
    if (clicked):
        cv2.rectangle(img, (20, 20), (750, 60), (blue, green, red), -1)

        text = getColourName(red, green, blue)   ' R='   str(red)   'G='   str(green)   ' B '   str(blue)

        cv2.putText(img, text, (50, 50), 2, 0.8, (0, 0, 0), 2, cv2.LINE_AA)

        if (red, blue, green >= 600):
            cv2.putText(img, text, (50, 50), 2, 0.8, (0, 0, 0), 2, cv2.LINE_AA)

        clicked = False

    if cv2.waitKey(20) amp; 0xFF == 27:
        break
cv2.destroyAllWindows()
  

Как всегда, любая помощь приветствуется.

Комментарии:

1. Мне кажется, что ‘color_select’ не является ключом к объекту args, который, как я предполагаю, является словарем. Вы могли бы легко выполнить отладку с помощью if ‘color_select’ в args: print(«не здесь»), или вы могли бы также запустить print(список(args.keys())), чтобы увидеть все ключи.

2. Ну, args создается из ArgumentParser , с определенным только одним аргументом, поэтому я бы ожидал, что args будет иметь только один элемент, 'i' ; там нет add_argument('--colour_select', ...) , так что 'colour_select' элемента в args не будет.

3. Как предположение, возможно, вы непоследовательно используете варианты написания «цвет» и «color»?

Ответ №1:

Я начал с выделения причины проблемы, чтобы

 import argparse
ap = argparse.ArgumentParser()
ap.add_argument('-i', required=True, help="PathToImage")
args = vars(ap.parse_args())
PathToImage = args['colour_select']
  

Я поместил этот код в «myscript.py «и запустил его; в частности, я попытался

 python myscript.py -i "hello"
  

Я смог воспроизвести проблему. Чтобы выяснить причину, я добавил инструкцию print

 import argparse
ap = argparse.ArgumentParser()
ap.add_argument('-i', required=True, help="PathToImage")
args = vars(ap.parse_args())
print(args)
PathToImage = args['colour_select']
  

То, что это показало в командной строке, было {'i': 'hello'}

Если вы хотите, чтобы ключ был colour_select , тогда вы должны использовать это в качестве строки аргумента

 import argparse
ap = argparse.ArgumentParser()
ap.add_argument('-colour_select', required=True, help="PathToImage")
args = vars(ap.parse_args())
if 'colour_select' not in args.keys():
    print("ERROR!")
PathToImage = args['colour_select']
print('PathToImage =',PathToImage)