#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)