ジャコ Lab

プログラミング関連のメモ帳的ブログです

GLIGEN 用の枠の配列の値の取得する方法

前回の記事までで 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}")

このプログラムで実行してみます。

なお、GUI を使うので Google Colab では出来ません。
自分は Ubuntu 上でやりました。
$ 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)
Rect はそれぞれ何を示しているんだ?

数値の感じからして、左上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 は便利