前回の記事までで GLIGEN (Grounded Language-to-Image GENeration) を使ってみましたが、GLIGEN を使用するときは バウンディングボックス が必要となります。
(矩形 や 枠 と記載したりもしているので文言は定まってませんが...)
バウンディングボックスは 左上のXY座標 と 右下のXY座標 の4つの値で成り立っています。 [x1, y1, x2, y2] という感じです。
この記事では、Python でバウンディングボックスの座標をマウスのドラッグ&ドロップで取得していきます。
はじめに
普通に バウンディングボックス という言葉を使っていましたが、用語を調べてみると 画像や映像の中の物体を囲んだ部分領域 のことをバウンディグボックスと言うようです。
単に 矩形 と言うと すべての角が直角の四辺形。長方形。 と出てきました。
画像処理分野 においては、
この枠のことを 関心領域 (ROI: Region of Interest) と言うらしいです。
度々使っている OpenCV は画像処理モジュールなので、この辺の取得は結構簡単にできます。
実際にやってみる
How To Select a Bounding Box in OpenCV Region Of Interest の記事を参考にさせていただきました。
プログラム
[app.py] -- import cv2 img = cv2.imread("./image.jpg") roi = cv2.selectROI("modal title", im) im_h, im_w, _ = im.shape[:3] print(f"width: {im_w}, height: {im_h}") print(f"ROI: {roi}")
このプログラムで実行してみます。
$ python app.py
Select a ROI and then press SPACE or ENTER button! Cancel the selection process by pressing c button!
このようなログが出ています。
画面が表示されたあと、マウスクリック&ドラッグで矩形を表示することができます。
def selectROI(windowName: str, img: cv2.typing.MatLike, showCrosshair: bool, fromCenter: bool, printNotice: bool ) -> cv2.typing.Rect:
selectROI
は上記のような定義をしているようなので showCrosshair=False
にすれば良さそうですね。
この後 Enter キーを押すと以下のログが出力されました。
width: 1024, height: 683 ROI: (769, 296, 205, 166)
数値の感じからして、左上XYと矩形のWHって感じですかね?
左上XY座標: (769, 296), 右下XY座標: (769+205, 296+166) って感じでしょうか?
画像サイズに合わせて百分率にする
x, y, w, h = roi x1 = x y1 = y x2 = x + w y2 = y + h print("box:", x1 / im_w, y1 / im_h, x2 / im_w, y2 / im_h)
box: 0.7509765625 0.4333821376281113 0.951171875 0.6764275256222547
こんな感じですかねぇ。
画像ソフトで答え合わせ
まとめ
OpenCV は便利