尝试修改LabelImg,将以对顶角画框改成以对角线相交点向四周画框
文章目錄
- 縮小代碼位置范圍
- 對縮小的范圍查找代碼
- shape.py
- 20200403
- 20200409
- 修改了以下`handleDrawing()`里的代碼,現(xiàn)在能夠把框畫成這樣子了,但是初始點和實時繪制還不知道怎么處理
- 后開在這加上這句之后就能將結果準確繪制了,但是實時顯示還是沒法達到預期
- 嘗試修改這句canvas.py里handleDrawing()函數(shù)里的這句
- 情況1
- 情況2
- 情況3
- 情況4
- 嘗試修改canvas.py里mouseMoveEvent()函數(shù)里的這句
- 20200420
縮小代碼位置范圍
- 打斷點,開始調試
發(fā)現(xiàn)沒啥用,點來點去控制臺一點反應都沒有
還是老老實實看源碼吧。。。。。
貌似找不到程序入口,哎,還是我技術太渣了。。。。
把斷點打在最前面調試:
臥槽,,沒法調試啊!!一點調試沒一會程序就直接結束了。。。。
只能一個包一個包去看它們的作用了。。
首先:
codecs:貌似用來做編碼轉換的
distutils.spawn:貌似是用來打包發(fā)布自定義python包的
os.path:貌似是用來操作路徑的
platform:貌似是用來獲取操作系統(tǒng)的信息的
re:正則化表達式
sys:有很多貌似比較有用的功能
subprocess:用于fork子進程,并運行外部程序
functools.partitial:貌似是用來包裝函數(shù)的,讓想要添加默認值的函數(shù)調用更加方便
collections.defaultdict:貌似這玩意有點復雜,不好解釋
PyQt5:非常方便的圖形界面編程庫
sip:方便地為C和C++庫創(chuàng)建Python綁定。它最初是為了創(chuàng)建PyQT,用于Qt工具包的Python綁定,但是可以用來為任何C或C++庫創(chuàng)建綁定。
順著程序往下看:
-
從libs.utils導包:
math.sqrt:用來求數(shù)字的平方根的
hashlib:提供了常見的摘要算法,如MD5,SHA1等等 -
從libs.settings導包:
pickle:序列化處理工具
os:文件/目錄方法 -
從libs.stringBundle導包
看作者寫的這個shape模塊有點像處理我們的框的模塊啊,先打個標記先@@@@
- 從libs.labelFile導包
又發(fā)現(xiàn)一個:yolo_io.py
這里面一定能夠找到對捕捉鼠標事件的處理函數(shù),到時多看看
對縮小的范圍查找代碼
前面的import看得差不多了,接下來著重看shape.py和yolo_io.py吧
shape.py
20200403
shape.py和yolo_io.py貌似也沒啥好看的,看了一些PyQt5基礎,在QWidget類中看到了按住鼠標拖動的觸發(fā)事件mouseMoveEvent(),我們是否能直接搜索這個方法找到需要修改代碼的未知呢?試試
調試了以下,貌似不是?程序啟動時就會調用mouseMoveEvent()函數(shù)了
問了下韋工,他說是在handleDrawing()函數(shù)里
20200409
修改了以下handleDrawing()里的代碼,現(xiàn)在能夠把框畫成這樣子了,但是初始點和實時繪制還不知道怎么處理
# Dontla 20200408 重寫handleDrawing()函數(shù)# pos就是當前像素點坐標def handleDrawing(self, pos):if self.current and self.current.reachMaxPoints() is False: # 如果框存在且沒有越界(這個是畫結果的)# print(self.current) # <libs.shape.Shape object at 0x00000200B63D0E10>initPos = self.current[0]# print(self.current[0]) # PyQt5.QtCore.QPointF(542.9382716049383, 201.8271604938272) # 方框框的繪制初始點minX = initPos.x()minY = initPos.y()# print(minX, minY) # 541.9382716049383 199.8271604938272targetPos = self.line[1] # 方框的繪制結束點maxX = targetPos.x()maxY = targetPos.y()# print(maxX, maxY)# self.current.addPoint(QPointF(maxX, minY))self.current.addPoint(QPointF(maxX, 2 * minY - maxY))self.current.addPoint(targetPos)self.current.addPoint(QPointF(2 * minX - maxX, maxY))self.finalise()elif not self.outOfPixmap(pos): # 如果框不存在且當前點沒有在畫布之外(這個是畫實時的)self.current = Shape()# self.current.addPoint(pos) # originself.current.addPoint(QPointF(pos.x(), pos.y())) # Dontla# self.line.points = [pos, pos] # originself.line.points = [QPointF(pos.x(), pos.y()), QPointF(pos.x(), pos.y())] # Dontlaself.setHiding()self.drawingPolygon.emit(True)self.update()
后開在這加上這句之后就能將結果準確繪制了,但是實時顯示還是沒法達到預期
嘗試修改這句canvas.py里handleDrawing()函數(shù)里的這句
情況1
情況2
情況3
強制繪制方形失效了,可能是有的地方沒弄好
情況4
雖然測試得一臉懵逼,但是還是能推斷得出個大概:
這個應該是初始化繪框射線用的,兩個點分別是初始化的射線起點和終點,只有設置起點是有用的,設置終點是沒有用的
嘗試修改canvas.py里mouseMoveEvent()函數(shù)里的這句
這個是可以修改繪制的目標點的坐標的
20200420
這一次我決定反過來,從將坐標寫入文件的地方從后往前詢
ctrl+shift+f項目全局搜索,搜索.write
應該就是箭頭所指的這句沒錯了
在yolo_io.py文件里
一步步往上詢:
然后跳到了labelFile.py文件
然后又跳到labelImg.py文件里來了
又跳到canvas.py文件來了
這TM也太多了吧,篩選篩選先
首先:
貌似這樣也不好看,不如對shapes變量添加一個監(jiān)視
監(jiān)控太復雜了,也是亂七八糟的,還不如一個一個看
看過了,好像沒啥,下一個
再看其他的
看是不是這個
真的,太多了,只有初始信號和末尾寫入的地方是確定的,其余的地方就像黑箱一樣
我去,我有點想放棄了,這破玩意
總結
以上是生活随笔為你收集整理的尝试修改LabelImg,将以对顶角画框改成以对角线相交点向四周画框的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何克服孤独和焦虑?How to ove
- 下一篇: 什么是序列化?python pickle