报错问题:
在使用labelimg的框选和label显示功能时,提示canvas.py或者shape.py中drawLine、drawRect、drawText不支持float类型作为参数。(如图示)
其本质原因是:在较新的PyQt版本中(如PyQt5),QPainter类中的相关draw方法不支持float数据作为参数传递。
解决方案:
这里不采用网上那些去改canvas.py、shape.py的方案。而是在labelImg.py中添加对QPainter类的部分方法的重写。
该方案优点在于,更改方便,移植到别的平台上也方便,不容易受到python的更新的影响。只需复制abelImg.py去替换报错的文件就行了。
或者你也可以选择使用labelImg原开发团队的新工具label-studio
解决方案步骤:
1.打开labelImg.py文件
路径位置:你的python安装位置\Lib\site-packages\labelImg
2.在MainWindow类之前粘贴上下面这段代码
class QPainterx(QPainter):
def drawLine(self, x1: float, y1: float, x2: float, y2: float):
super().drawLine(int(x1), int(y1), int(x2), int(y2))
def drawRect(self, x: float, y: float, w: float, h: float):
super().drawRect(int(x), int(y), int(w), int(h))
def drawText(self, x: float, y: float, s: object):
super().drawText(int(x), int(y), s)
注意换行和缩进
粘贴后效果如下
3.修改canvas的_painter成员
在MainWindow的__init__方法中,找到
self.canvas = Canvas(parent=self)
在其下方插入代码
self.canvas._painter = QPainterx()
添加后效果如下:
4.其他报错补充:
由于报错出现位置时在labelImg.py中,修复方式就十分简单了,哪一行报错,就把对应的float值转int就行。
scroll_request方法内:
set_zoom方法内:
zoom_request方法内:
5.记得保存,然后控制台输入labelimg跑跑看是否修改成功