milk_spoonのブログ

さじの情報科学的活動、考えたこと、その他を雑記するためのブログです。

OpenCV+Siv3Dで超簡単な画像補正ソフトを作った

spoonblog.hatenablog.com

これでOpenCVとSiv3D一緒に使えるよ!といったものの実際の使用例がなくては話にならないので
ちょうど自分で試したかったことも合わせて、デモ的ではあるけど2つほど作りました

ソース↓
https://github.com/saji-spoon/OpenCV-Siv3DSamplegithub.com

動くやつ↓
https://github.com/saji-spoon/OpenCV-Siv3DSample/releases/tag/1.00

以下、問題設定とかSiv3Dと合わせた表示結果とかについて説明するのでOpenCVの画像処理そのものの深いところの説明はあまりしません。
輪郭検出とか個別のことは気が向いたら書くかもしれないけど詳しくはソースで(

1. アンケート用紙の枠検出

(Form-Siv3D(August2016v2)プロジェクト)

こんな感じ↓のアンケート用紙からOpenCVで入力枠を検出したい
f:id:milk_spoon:20171208012038j:plain

個人的にはこの記事↓めっちゃ参考になった…
画像から四角いものを検出する、ってときにだいたい必要なものが解説されてる気がする
dev.classmethod.jp

画像から四角いものを検出するには結構色々手順がいるけども、とりあえず「輪郭検出」→「ゴミ取り」(一定以下の面積の輪郭を取り除く)というところを考えると、「一定以下」ってどれくらいの数値ならいいのかがよくわからない。

ということで、スライダーで値を調整しながら、指定された値より面積が大きい輪郭しか表示しないようにSiv3Dで表示させてみた。
f:id:milk_spoon:20171208012536p:plain
デフォルトだとこの状態で、アンケート用紙に書かれた文字まで輪郭検出してしまっている。

f:id:milk_spoon:20171208012608p:plain
スライダーを少し右に動かすと、文字から検出した輪郭は表示されなくなる。5000を超えたあたりで一番小さい入力欄も表示されなくなってしまうこともわかる。

ゴミ取っただけだとタイトルとかも入ってしまっているけど、ここから切り出したい画像だけクリックで指定…とかも割と簡単に発展できそう。

2. アンケート用紙のスキュー補正

(SkewCorrect-Siv3D(August2016v2)プロジェクト)

またアンケート用紙。
白紙のと、記入済みだけど曲がってしまっているのがある。
スキャナで取るとき下手くそだと曲がりますね。

f:id:milk_spoon:20171208013037j:plainf:id:milk_spoon:20171208013040j:plain

ただ、アンケート用紙には一番外側にふっとい枠線がある。これを検出して曲がっているのを補正できる…はず。
スキャンしたときとか曲がってしまったり歪んでしまったりして結果画像がズレてるのをスキューと言います。これを直すのでスキュー補正。
f:id:milk_spoon:20171208013449p:plain
これが白紙画像。これの補正枠を基準として、これに合わせて直す。

f:id:milk_spoon:20171208013458p:plain
曲がってしまってる記入済みの画像。でも補正枠は検出できてるので、これを白紙画像の補正枠と合わせるように変形すればいい。

f:id:milk_spoon:20171208013455p:plain
できました。

輪郭検出と直線近似で補正枠の四角形はとれた上で、
cv::getPerspectiveTransform
cv::warpPerspective
の2つの関数を使うと、一方を基準として、もう一方をそこにあわせる、みたいな画像の変形ができる(ふんわり)。
正確にはcv::getPerspectiveTransformで、4点から4点への変換行列を作り、cv::warpPerspectiveで作った行列を用いて実際に画像変形を行う。
まあでも、今回は単純に歪んでる方の補正枠を正しい補正枠に合わせるように変形しているだけといえばそれだけ。

Siv3D単体でも結構な加工とか画像処理(輪郭検出すら)できるので
OpenCVだけでできるのはなんじゃろなーと考えてたけど、自分の知ってる範囲ではcv::warpPerspectiveかな…と。
予想以上にきれいに補正できて(画像がもともときれいなのはあるけど)びっくり。
真っ直ぐにした画像を予め用意してるとかそういうわけではないぞ!

まとめ

やっぱり値を調整しつつリアルタイムで見れるのとか、座標クリックとかで操作しつつ次の処理を決めたりとかするにはSiv3Dの機能が強力。
簡単な操作で大量の画像の切り出しとか加工を自動化できると色々役に立つかも。
特に最近機械学習がブームで大真面目に大手がソースコードの画像を機械学習にぶっこんだりしているので、やっぱり画像処理できると強いと思います(雑)