【问题标题】:TypeError: an integer is required (got type str) in pythonTypeError:python中需要一个整数(得到类型str)
【发布时间】:2019-04-14 13:31:35
【问题描述】:

我正在 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)

如何解决此错误。请帮忙

【问题讨论】:

  • 如何“给定”参数?错误消息似乎很清楚,代码在某个地方得到了一个字符串,它需要一个整数。例如,'3' 和 3 之间是有区别的。
  • 您需要发布更多的回溯以便我们理解。也许可以编辑您的问题并发布完整的回溯?
  • 据我所知,Dictionary_get() 采用 int 参数。字符串上的join() 方法返回一个字符串。在您存储在path 变量中的情况下,最后您将该字符串传递给Dictionary_get()。只需检查参数。

标签: python opencv augmented-reality aruco


【解决方案1】:

正如我在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"

你会发现,第二个负责错误。

我对解决此类问题的建议是创建任何名为 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)
# ...
# ...

【讨论】:

    【解决方案2】:

    "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)
    ...
    

    【讨论】:

    • 耶!如果您认为这是您问题中问题的最佳解决方案,请accept the answer。
    猜你喜欢
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    相关资源
    最近更新 更多