訂製 Bounding Box Class
方便用戶縮放拖拉 Bounding Box
針對標示Bounding Box 的需求, 我們對一個圖像, 要能畫出 (創建)新的 Bounding Box 來, 同時我們希望能對它進行縮放與移動的基本操作, 當然如果誤操作時, 可以直接刪掉. 我們直接以下圖來說明.
假設顯微鏡下細胞可分為正常(Positive), 非典型(Atypia), 待進一步確認(Suspicious) . 這當然是虛構的, 醫學上應該有更嚴謹的分類定義. 我們打算以顏色來代表分類.
1.Positive
2.Suspicious
3.Atypia
用戶可以按 1/2/3 快速變換後續要標示的類別 Positive/Suspicious/Atypia, 按下 <Del> 鍵刪除選定的 Bounding Box, 同時可以拖拉Bounding Box 四周的八個控制點來改變其尺寸大小
Bounding Box
如圖示:
有2個 Positive Bounding Box, 快速鍵為1
有1個 Suspicious Bounding Box, 快速鍵為2
有2個 Atypia Bounding Box, 快速鍵為3
需求大約如下:
系統應該可以讓用戶自由設定與Bounding Box 顏色對應的類別以及切換類別快速鍵.
按滑鼠左鍵即在其位置生成新的 Bounding Box.
每個Bounding Box除了八個控制點來改變其尺寸大小外,
可長按拖動來移動位置,
按下 <Del> 鍵刪除選定的 Bounding Box
有了需求, 我們找最符合的 Qt 元件, QGraphicsRectItem, 來繼承, 事實上也不需要自己再次發明輪胎, 在 stackoverflow 找到一組討論, 幾乎就是我們要的, 只不過它是用 PyQt5 而我們已決定要用 PySide6 開發, 這就簡單了, 按照之前寫的PyQt5 移植 PySide6原則改一下, 馬上可以改為 PySide6.
與需求比較大的差異是我們需要依照類別給予不同顏色. 那也簡單只要賦於一個colorName屬性
def __init__(self, *args):
#...
改為
def __init__(self,colorName, *args):
self.colorName=colorName
#...
上面為原始程式碼, 下方為我們修改為 PySide6 且增加我們的需求的程式碼, 比較大的差異:
增加getColorPosSize 方法, 目的在輸出 該 boundingBox 的顏色與位置尺寸.
比較上下兩個版本程式, 從 import 可大略知道PyQt5, PySide6 兩者還是有小差異的, 但又不好直接採 qtpy 自動移植. 所以小改寫成下面的 PySide6 版本.
如果不考慮改為 PySide6, 其實比較好的設計是直接繼承上面的 Class, 做點擴充即可.