OpenCVを使って直線で画像を分割するマスクを作成する方法を考えた話

Pocket
LINEで送る

はじめに

ある仕事で画像を直線で分割し、片方をマスクした後別の画像に張り付ける必要があった。そんな機能が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)に目的の機能が見つからずどうしようと思ったけど、やってみたら意外とできた。

 

Pocket
LINEで送る

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください