TypeError: an integer is required (got type str) in python
TypeError: an integer is required (got type str) in python
我在 Python 中使用 OpenCV ArUco。我正在尝试生成不同目录的多个代码。为了一次性生成它,我在循环中使用了这个函数。例如 list1 =[1,2,3,4],comb = [50,100,250,1000],ids = [1,22,3,45]
def generator(bsize,comb,ids):
bitsize = [bsize]+['X']+[bsize]
bitz = ''.join(bitsize)
dicts = ['DICT']+[bitz]+[comb]
dictionary = '_'.join(dicts)
print(dictionary)
path = ['aruco']+[dictionary]
print(path)
path = '.'.join(path)
print(path)
aruco_dict = aruco.Dictionary_get(path)
img = aruco.drawMarker(aruco_dict, ids, bsize)
cv2.imshow('frame',img)
for i in range(0,7):
generator(list1[i],list2[i],list3[i])
'path' 的输出是:
aruco.DICT_4X4_1000
之后出现错误:
line 35, in generator
aruco_dict = aruco.Dictionary_get(path)
TypeError: an integer is required (got type str)
我该如何解决这个错误。请帮忙
"aruco.DICT_4X4_1000"
,一个字符串,不同于aruco.DICT_4X4_1000
,aruco
中的一个属性。
如果您想以编程方式访问 aruco
属性 DICT_4X4_1000
的值,您 can use:
getattr(aruco, "DICT_4X4_1000")
所以你获取 path
的代码应该是:
...
path = getattr(aruco, dictionary)
...
正如我在 http://www.philipzucker.com/aruco-in-opencv/ 中所见,aruco.DICT_6X6_250
是实常数 (int)。在你的罐子里它是一个字符串 "aruco.DICT_6X6_250"
,这是错误的主要原因。为了澄清起见,只需尝试使用以下 2 条语句代替 path = '.'.join(path)
.
有效
path = aruco.DICT_4X4_1000
无效
path = "aruco.DICT_4X4_1000"
You'll find, the 2nd one is responsible for error.
我的解决此类问题的建议是创建任何名为 arcuo_constants.py 的模块并将如下内容放入其中。
arcuo_constants.py
import cv2
import cv2.aruco as aruco
# define all possible constants here
ARUCO_CONSTANTS = {
"aruco.DICT_6X6_250": aruco.DICT_6X6_250,
"aruco.DICT_4X4_1000": aruco.DICT_4X4_1000
}
最后在您的代码文件中,您可以按如下方式导入和使用这些值(假设模块文件位于同一目录中)。
import aruco_constants
ARUCO_CONSTANTS = aruco_constants.ARUCO_CONSTANTS # A dictionary
# ...
# ...
path = '.'.join(path)
path = ARUCO_CONSTANTS[path]
aruco_dict = aruco.Dictionary_get(path)
# ...
# ...
我在 Python 中使用 OpenCV ArUco。我正在尝试生成不同目录的多个代码。为了一次性生成它,我在循环中使用了这个函数。例如 list1 =[1,2,3,4],comb = [50,100,250,1000],ids = [1,22,3,45]
def generator(bsize,comb,ids):
bitsize = [bsize]+['X']+[bsize]
bitz = ''.join(bitsize)
dicts = ['DICT']+[bitz]+[comb]
dictionary = '_'.join(dicts)
print(dictionary)
path = ['aruco']+[dictionary]
print(path)
path = '.'.join(path)
print(path)
aruco_dict = aruco.Dictionary_get(path)
img = aruco.drawMarker(aruco_dict, ids, bsize)
cv2.imshow('frame',img)
for i in range(0,7):
generator(list1[i],list2[i],list3[i])
'path' 的输出是:
aruco.DICT_4X4_1000
之后出现错误:
line 35, in generator
aruco_dict = aruco.Dictionary_get(path)
TypeError: an integer is required (got type str)
我该如何解决这个错误。请帮忙
"aruco.DICT_4X4_1000"
,一个字符串,不同于aruco.DICT_4X4_1000
,aruco
中的一个属性。
如果您想以编程方式访问 aruco
属性 DICT_4X4_1000
的值,您 can use:
getattr(aruco, "DICT_4X4_1000")
所以你获取 path
的代码应该是:
...
path = getattr(aruco, dictionary)
...
正如我在 http://www.philipzucker.com/aruco-in-opencv/ 中所见,aruco.DICT_6X6_250
是实常数 (int)。在你的罐子里它是一个字符串 "aruco.DICT_6X6_250"
,这是错误的主要原因。为了澄清起见,只需尝试使用以下 2 条语句代替 path = '.'.join(path)
.
有效
path = aruco.DICT_4X4_1000
无效
path = "aruco.DICT_4X4_1000"
You'll find, the 2nd one is responsible for error.
我的解决此类问题的建议是创建任何名为 arcuo_constants.py 的模块并将如下内容放入其中。
arcuo_constants.py
import cv2
import cv2.aruco as aruco
# define all possible constants here
ARUCO_CONSTANTS = {
"aruco.DICT_6X6_250": aruco.DICT_6X6_250,
"aruco.DICT_4X4_1000": aruco.DICT_4X4_1000
}
最后在您的代码文件中,您可以按如下方式导入和使用这些值(假设模块文件位于同一目录中)。
import aruco_constants
ARUCO_CONSTANTS = aruco_constants.ARUCO_CONSTANTS # A dictionary
# ...
# ...
path = '.'.join(path)
path = ARUCO_CONSTANTS[path]
aruco_dict = aruco.Dictionary_get(path)
# ...
# ...