Python+OpenCVで画像編集の練習2

前回の記事ではTIFF画像を読み込んで表示するところまで進めた。今回はユーザー入力された原点座標・傾きの直線を引くところまで一気にやってみようと思う。

取り敢えず画像に直線を引く

直線を描画するにはcv2.line関数を使用する。引数として直線の始点と終点の座標、また線の色と幅を指定する必要がある。以下をcv2.imreadの直後に記載。

# 画像の高さ、幅を取得
height = img.shape[0]
width = img.shape[1]

# 左上から右下まで太さ10の赤い線を引く
## 引数:表示する画像のNumPy配列, 始点, 終点, 線色, 線幅
cv2.line(img, (0, 0), (width-1, height-1), (0, 0, 255), 10)

表示された!!あと一歩な気がする。

ユーザから入力された原点座標・傾きの直線を引く

ユーザーからの入力値を反映する。

# ユーザ入力は文字列型のため数値型にキャストする
# ユーザから原点座標x0を得る(整数型)
x0 = int(input(“原点座標x0を入力して下さい:”))

# ユーザから原点座標y0を得る(整数型)
y0 = int(input(“原点座標y0を入力して下さい:”))

# ユーザから傾きaを得る(浮動小数点型)
a = float(input(“傾きaを入力して下さい:”))

ユーザ入力はinput関数を使用する。input関数の戻り値は数値でも文字列型として扱われるためキャストの必要がある。続いて入力情報から終点の座標を取得する。

# 原点座標(x0, y0)から傾きaの直線を引いた際の画像右端(x=width)との交点座標ypを算出
## y+y0=a(x-x0)に対してx=widthを代入しyについて解く
## int型とfloat型が混在する式の計算結果はfloat型になる
yp=a*(width-x0)-y0

# 四捨五入してint型にキャスト
## 引数:対象変数, 四捨五入する位
yl=int(round(yp, 0))

# 画像下方向に向かって正が取られているため変換
yl=y0-yl

この辺りの計算はこの記事の本質ではないため説明は省く。傾きは小数値で扱うものの座標は整数値となるため、まずround関数で四捨五入してからint型にキャストしている。単純にint型へのキャストでは小数点以下が切り捨てられてしまう。

やりたいこと、一応完成!ただユーザーとのやり取りがコマンドプロンプトのため、続いてGUIを組み込んでみたいと思う。