はじめに
OpenCVのトラックバーを使用して、
画像処理時のパラメータを調整するためのテストプログラム。
今回は、ガンマ補正した画像に対して二値化を行う。
テスト用画像の読み込み
カメラから取得した画像を使用する。
取得した画像をグレースケールに変換して画素値の最大を取得(ガンマ補正用)
import cv2
import sys
cameraId = 0
capCam = cv2.VideoCapture(cameraId)
if not capCam.isOpened():
sys.exit()
ret, frame = capCam.read()
gray = cv2.cvtColor(frame, cv2.COLOR_RGBA2GRAY)
grayMax = gray.max()
トラックバーを生成する
ガンマ補正値(gamma)と閾値(threshold1)を調整するためのトラックバーを生成する
gamma = 0.5
threshold = 28
def nothing(x):
pass
cv2.namedWindow('window')
cv2.createTrackbar('gamma','window', int(gamma*10) , 50, nothing)
cv2.createTrackbar('threshold1','window', threshold , 255, nothing)
引数は以下のようになっている
CreateTrackbar(trackbarName, windowName, value, count, onChange)
- trackbarname : 作成されるトラックバーの名前
- windowName : 作成されるトラックバーの親として用いられるウィンドウの名前(事前に生成しておく)
- value : 作成時のスライダー位置
- count : スライダーの最大値(最小値は0固定)
- onChange : スライダーの位置変更時のコールバック
gammaには0.1刻みの値を適用したいため、
トラックバー上は10倍した値としている。
トラックバーと画像の表示
トラックバーから値を取得して画像に適用する
import numpy as np
delay = 1
ESC_KEY = 27
while True:
# ESCキーを入力したら終了
if cv2.waitKey(delay) == ESC_KEY:
break
# トラックバーから値を取得
gamma = cv2.getTrackbarPos('gamma','window')
threshold = cv2.getTrackbarPos('threshold1','window')
if gamma > 0:
gamma /= 10
else:
gamma = 0.1
# ガンマ補正
lut = np.zeros((256, 1), dtype='uint8')
for i in range(256):
lut[i][0] = grayMax * pow(float(i)/grayMax, 1.0/gamma)
gray_gamma = cv2.LUT(gray, lut)
# 二値化
ret, threshold = cv2.threshold(gray_gamma, threshold, 255, cv2.THRESH_BINARY)
# 描画
cv2.imshow("window", threshold)
gammaは1/10にした値を使用する。
0は許容できない(div/0で落ちる)ため、0.1に補正する。
表示させると以下のようなイメージとなる。
スライダーでパラメータを変更すると適用された値で描画される。