こんにちは、エピックです。
今回は、OpenCVで利用可能なGUIについてです。
OpenCVは、画像処理を行うライブラリであり、裏側での処理しかできないと思っていませんか。
そんなことはありません!
実は OpenCV には標準でユーザインタラクティブに連携可能なGUIが備わっています。
今回はその中から、最も利用頻度の高いトラックバーについて紹介します。
OpenCVのGUI機能 -トラックバー
OpenCVで利用可能なGUIの一つにトラックバーがあります。
トラックバーとは、つまみ (スライダー) と目盛りの2つの部分からなるコントロールGUIです。
イメージが付かないという方のために画像を貼っておきます。
トラックバーを利用することで、画像処理の際に渡すパラメータ(例えば、閾値)を実際の画像の変化を見ながら決めることができます。
そのため、いちいちコード上で修正→確認を繰り返す必要がなく、効率的な作業が可能となります。
また、画面上で変化をかくにんできるため、率直に楽しいです。
トラックバーを作成する
実際にベースとなるコードを書いてみます。
トラックバーを作成する際に利用する関数ですが、cv2.createTrackbar() および cv2.getTrackbarPos() を記述します。
前者がトラックバー自体の生成、後者がユーザからのインプット取得に利用します。
まず、cv2.createTrackbar() ですが次の引数を設定します。
第一引数 | トラックバーの名前 |
第二引数 | トラックバーを付与するウィンドウ名 |
第三引数 | トラックバーの初期値 ※あくまで初期値であり下限ではない |
第四引数 | トラックバーの最大値 |
第五引数 | コールバック(呼び出し)関数名 |
気をつけたいのは、トラックバーはウィンドウではないため、第二引数にあるように事前にウィンドウを生成しておく必要があります。
これには、cv2.namedWindow() と記述します。
つづいて、cv2.getTrackbarPos() がこちらは2つの引数があり、設定項目は次のとおりです。
非常に簡易的な設定のみでに値を取得できてしまいます。
第一引数 | 対象とするトラックバーの名前 |
第二引数 | トラックバーを付与しているウィンドウ名 |
では、2値化(cv2.threshold)とあわせて確認をしてみます。
import cv2
import numpy as np
def printing(position):
print(position)
# 画像を読み込み
# cv2.imread() を利用しグレースケールで読み込む
img = cv2.imread("color.png", 0)
# トラックバーを表示するウィンドウを作成
cv2.namedWindow("window")
# 初期値を設定
threshold = 150
# トラックバーを作成する
# トラックバーの名前、トラックバーをつけるウィンドウ名、初期値、トラックバーの最大値。コールバック関数
cv2.createTrackbar("track", "window", threshold, 255, printing)
while True:
# cv2.THRESH_BINARY にて2値化する
ret, th = cv2.threshold(img, threshold, 255, cv2.THRESH_BINARY)
# トラックバーの位置をthreshholdに代入
threshold = cv2.getTrackbarPos("track", "window")
# 画像を表示する
# 引数はWindow名に合わせる
cv2.imshow('window', th)
if cv2.waitKey(10) == 27:
break
cv2.destroyAllWindows()
どうでしょうか?
下にトラックバーがついた画像が表示されたのではないでしょうか。
最後に
いかがだったでしょうか。GUIで操作でイメージがつきやすかったのではにかと思います。このように別のライブラリを利用することなく、非常に簡単にインタラクティブなUIを作成できる点もOpenCVの強みと言えますね。
今回も最後までお読みいただきありがとうございました。
では。