はじめに
ある仕事で画像を直線で分割し、片方をマスクした後別の画像に張り付ける必要があった。そんな機能がOpenCVにあるのかもしれないけど、見つけられなかったので自作した話。(コードはありません)
やりたいこと
上記①の画像を、②座標(x,y)を通る角度θの直線で分割したマスクを作成し、③の画像に張り付ける
やったこと
- ①画像のwidth,heightをX、Yとし、ABCDの各座標を求める
- ②O(x,y)を中心に、ABCDの座標を-θ回転させる
- ABCDのうちy座標がマイナスとなった点を抽出(上記図の場合AB)
- 直線A-B、B-C、C-D、D-Aの両端の座標で、y座標がマイナスとプラスになった直線を抽出(上記図の場合B-C、D-A)→つまり分割線と交差する辺
- 分割線と交差する辺の交点EFを求める。(辺の両端の座標からy=ax+bのabを求め、y=0を代入してxを求める)
- 結果、マスクするエリアの頂点はABEFとなる
マスクを作る際、多角形をプロットする座標が必要になるが、例えばABEFの順で登録すると多角形が正しく四角形にならない。四角にするため順番を決める必要がある。
- ①ABEFの座標について、Oを中心とした角度を求める
- 角度でソートして順番を決定する。結果EABFの順になる。
- ②最後にEABFの座標をOを中心として角度θ回転させた座標を計算する(図Bで回転した座標をもとに戻す)
- EABFを使ってマスクを作成する
最後に
OpenCV(OpenCvSharp)に目的の機能が見つからずどうしようと思ったけど、やってみたら意外とできた。