LabelImg 尝试标记时关闭,“Canvas.py”文件中出现错误

问题描述 投票:0回答:1
  • 所以: Windows 11 21H2
  • Python: 3.11.4
  • 版本标签Img:1.8.6
  • 安装收集的软件包: pyqt5 (5.15.9)、lxml (4.9.3)、PyQt5-sip (12.12.2)、PyQt5-Qt5 (5.15.2)


安装: pip install labelImg


问题:

我正在使用 YOLOv7 开发一个对象检测模型,为此我需要“labelImg”工具,我可以安装它,我可以运行它。

当我选择“创建矩形框”工具并将光标移动到图像上(尚未进行任何选择)时,程序关闭


错误:

C:\Users\Alecx>labelImg
Traceback (most recent call last):
  File "C:\Users\Alecx\AppData\Local\Programs\Python\Python311\Lib\site-packages\libs\canvas.py", line 530, in paintEvent
    p.drawLine(self.prev_point.x(), 0, self.prev_point.x(), self.pixmap.height())
TypeError: arguments did not match any overloaded call:
  drawLine(self, l: QLineF): argument 1 has unexpected type 'float'
  drawLine(self, line: QLine): argument 1 has unexpected type 'float'
  drawLine(self, x1: int, y1: int, x2: int, y2: int): argument 1 has unexpected type 'float'
  drawLine(self, p1: QPoint, p2: QPoint): argument 1 has unexpected type 'float'
  drawLine(self, p1: Union[QPointF, QPoint], p2: Union[QPointF, QPoint]): argument 1 has unexpected type 'float'

我尝试用以下方法修复它:

  1. 尝试查看canvas.py中引用drawLine的代码部分,并检查参数是如何传递的。
    但我无法修复值的传递方式以匹配 drawLine 函数所需的类型。

  2. 尝试通过克隆存储库来安装“labelImg”(同样的错误)

  3. 安装以前版本的必要包,直觉是最新版本出错了。

  4. 我在Windows 10 Home上安装了它(同样的错误)

您可以检查驱动器上的“Canvas.py”文件:

Canvas.py

python-3.x tensorflow computer-vision labeling yolov7
1个回答
0
投票

当几个人尝试修复这些问题时,他们说要更改操作系统、Python 版本和一堆其他更改,但这并不意味着解决问题,而是转移到系统的另一个版本,这样问题就不会发生。 在这个答案中,我将教您如何在没有类似问题的情况下解决问题,答案是错误本身自学的,但让我们开始吧。

在你的 Python 目录中有一个名为

C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\site-packages\libs
的文件夹,进入其中并查找名为
canvas.py
的文件。在此文件中,您将转到第 526、530 和 531 行,并更改进入 drawLine 函数的所有信息,如下所示。

将第 526 行从

p.drawRect(left_top.x(), left_top.y(), rect_width, rect_height)
更改为
p.drawRect(int(left_top.x()), int(left_top.y()), int(rect_width), int(rect_height))

530线从

p.drawLine(self.prev_point.x(), 0, self.prev_point.x(), self.pixmap.height())
p.drawLine(int(self.prev_point.x()), 0, int(self.prev_point.x()), int(self.pixmap.height()))

最后,从

p.drawLine(0, self.prev_point.y(), self.pixmap.width(), self.prev_point.y())
p.drawLine(0, int(self.prev_point.y()), int(self.pixmap.width()), int(self.prev_point.y()))
的 531 号线。

请注意,我仅将函数中的变量声明为整数,这可能最终意味着对所绘制的图形进行最小舍入,但在最终结果中不会具有最小有效尺寸。

之后,为了确保一切正常,在目录

C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\site-packages\labelImg
中查找名为
labelImg.py
的代码,并将其第 965 行更改为
bar.setValue(bar.value() + bar.singleStep() * units)
bar.setValue(int(bar.value() + bar.singleStep() * units))

解释:问题在于通过绘图函数读取这些变量时出现错误,如果我没记错的话,从 Python 3.8 版本开始,绘图函数目前不允许使用非整数。也就是说,这些修改应该适用于上述任何版本的 Python,我什至在 3.11 和 3.12 上测试过它,无论是 Windows 还是 Linux,它都可以正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.