2021年8月15日日曜日

【OpenCV】warpPerspectiveによる射影変換

 画像処理ライブラリOpenCVで画像の射影変換を行うwarpPerspectiveについて説明する。
射影変換は任意の形の四角形から別の形の四角形への変形で、台形を長方形に変換する場合などに用いる。


OpenCVを使うには次のようにインポートが必要。
import cv2

例に用いる画像'poster.jpg'(幅600x高さ450ピクセル)は以下を使用(フリー写真素材ぱくたそより)




1. 書式

 cv2.warpPerspectiveの書式は以下の通り。

dst = cv2.warpPerspective(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]])
引数 意味
dst 変換後の画像
src 元画像
M 3x3の変換行列
dsize 変換後の画像サイズ。(幅, 高さ)のタプルで指定
flags interpolation(補完方法)の指定など


2. getPerspectiveTransformを用いた変換行列の生成

 変換行列Mを生成するためにはgetPerspectiveTransformを用いる。変換前の座標4点と変換後の座標4点をそれぞれ二次元ndarryで与えることで変換行列が生成される。

例の画像に対して
返還前の座標4点[88, 45], [230, 110], [100, 420], [233, 333]から
返還前の座標4点[100,100], [400,100], [100,400], [400,400]へ変換する例。

import cv2
import numpy as np

img = cv2.imread('poster.jpg')
rows,cols,ch = img.shape

pts1 = np.float32([[88, 45], [230, 110], [100, 420], [233, 333]])
pts2 = np.float32([[100,100], [400,100], [100,400], [400,400]])

M = cv2.getPerspectiveTransform(pts1, pts2)

dst = cv2.warpPerspective(img, M, (cols, rows))

cv2.imwrite('warpPerspective.jpg', dst)

実行結果





変換前、返還後の座標4点をそれぞれの画像に図示すると以下の通り。斜めから見たポスターを正面から見た像に変換できる。

変換前



変換後





3. リファレンス

OpenCV > Geometric Image Transformations > warpPerspective()
OpenCV > Geometric Image Transformations > getPerspectiveTransform()

使用したバージョン:Python 3.8.8 / OpenCV 4.0.1

0 件のコメント:

コメントを投稿