日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

尝试修改LabelImg,将以对顶角画框改成以对角线相交点向四周画框

發布時間:2025/3/20 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 尝试修改LabelImg,将以对顶角画框改成以对角线相交点向四周画框 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 縮小代碼位置范圍
    • 對縮小的范圍查找代碼
      • shape.py
    • 20200403
    • 20200409
      • 修改了以下`handleDrawing()`里的代碼,現在能夠把框畫成這樣子了,但是初始點和實時繪制還不知道怎么處理
      • 后開在這加上這句之后就能將結果準確繪制了,但是實時顯示還是沒法達到預期
      • 嘗試修改這句canvas.py里handleDrawing()函數里的這句
        • 情況1
        • 情況2
        • 情況3
        • 情況4
      • 嘗試修改canvas.py里mouseMoveEvent()函數里的這句
    • 20200420

縮小代碼位置范圍

  • 打斷點,開始調試







    發現沒啥用,點來點去控制臺一點反應都沒有


    還是老老實實看源碼吧。。。。。

貌似找不到程序入口,哎,還是我技術太渣了。。。。

把斷點打在最前面調試:

臥槽,,沒法調試啊!!一點調試沒一會程序就直接結束了。。。。

只能一個包一個包去看它們的作用了。。

首先:
codecs:貌似用來做編碼轉換的
distutils.spawn:貌似是用來打包發布自定義python包的
os.path:貌似是用來操作路徑的
platform:貌似是用來獲取操作系統的信息的
re:正則化表達式
sys:有很多貌似比較有用的功能
subprocess:用于fork子進程,并運行外部程序
functools.partitial:貌似是用來包裝函數的,讓想要添加默認值的函數調用更加方便
collections.defaultdict:貌似這玩意有點復雜,不好解釋
PyQt5:非常方便的圖形界面編程庫
sip:方便地為C和C++庫創建Python綁定。它最初是為了創建PyQT,用于Qt工具包的Python綁定,但是可以用來為任何C或C++庫創建綁定。

順著程序往下看:

  • 從libs.utils導包:

    math.sqrt:用來求數字的平方根的
    hashlib:提供了常見的摘要算法,如MD5,SHA1等等

  • 從libs.settings導包:

    pickle:序列化處理工具
    os:文件/目錄方法

  • 從libs.stringBundle導包

看作者寫的這個shape模塊有點像處理我們的框的模塊啊,先打個標記先@@@@

  • 從libs.labelFile導包
    又發現一個:yolo_io.py

    這里面一定能夠找到對捕捉鼠標事件的處理函數,到時多看看

對縮小的范圍查找代碼

前面的import看得差不多了,接下來著重看shape.py和yolo_io.py吧

shape.py

20200403

shape.py和yolo_io.py貌似也沒啥好看的,看了一些PyQt5基礎,在QWidget類中看到了按住鼠標拖動的觸發事件mouseMoveEvent(),我們是否能直接搜索這個方法找到需要修改代碼的未知呢?試試

調試了以下,貌似不是?程序啟動時就會調用mouseMoveEvent()函數了

問了下韋工,他說是在handleDrawing()函數里

20200409

修改了以下handleDrawing()里的代碼,現在能夠把框畫成這樣子了,但是初始點和實時繪制還不知道怎么處理

# Dontla 20200408 重寫handleDrawing()函數# 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()函數里的這句

情況1



情況2



情況3



強制繪制方形失效了,可能是有的地方沒弄好

情況4



雖然測試得一臉懵逼,但是還是能推斷得出個大概:

這個應該是初始化繪框射線用的,兩個點分別是初始化的射線起點和終點,只有設置起點是有用的,設置終點是沒有用的

嘗試修改canvas.py里mouseMoveEvent()函數里的這句


這個是可以修改繪制的目標點的坐標的

20200420

這一次我決定反過來,從將坐標寫入文件的地方從后往前詢

ctrl+shift+f項目全局搜索,搜索.write

應該就是箭頭所指的這句沒錯了

在yolo_io.py文件里

一步步往上詢:





然后跳到了labelFile.py文件







然后又跳到labelImg.py文件里來了


又跳到canvas.py文件來了

這TM也太多了吧,篩選篩選先

首先:

貌似這樣也不好看,不如對shapes變量添加一個監視

監控太復雜了,也是亂七八糟的,還不如一個一個看


看過了,好像沒啥,下一個


再看其他的

看是不是這個



真的,太多了,只有初始信號和末尾寫入的地方是確定的,其余的地方就像黑箱一樣

我去,我有點想放棄了,這破玩意

總結

以上是生活随笔為你收集整理的尝试修改LabelImg,将以对顶角画框改成以对角线相交点向四周画框的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。