訂製 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

1Suspicious Bounding Box, 快速鍵為2

有2個 Atypia Bounding Box, 快速鍵為3

需求大約如下:

  1. 系統應該可以讓用戶自由設定與Bounding Box 顏色對應的類別以及切換類別快速鍵.

  2. 按滑鼠左鍵即在其位置生成新的 Bounding Box.

  3. 每個Bounding Box除了八個控制點來改變其尺寸大小外,

  4. 可長按拖動來移動位置,

  5. 按下 <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, 做點擴充即可.