Pythonで雪が降ってたらLINEに通知を出してみる その2 特徴点による比較
年が明け、だいぶ時間がたってしまいましたが、年明け早々に雪が降りましたので、前回の続きで特徴点マッチングを試していきます。当初の方針は、雪のない夜の写真と一時間ごとに更新される写真とで特徴点による比較をし、雪が積もれば差異が大きくなるので、それを検知してラインに通知を送るというものです。
基本的にはOpenCVを利用しました。
参考にさせていただいたサイトはこのあたりです。
ここで当初から方向転換がありまして、一度雪が降ると通知が止まらなくなってしまい、うるさいことになってしまいました。
ですので、一時間前に取得した写真との比較をメインにしていきたいと思います。一時時間前と差が大きい写真が取れた場合に、ラインに通知を送ります。
ここで、事前に画像処理をかけたほうが検出の頻度が上がるのではないかと考え、いくつかの処理を試し、それぞれの結果をまとめてみました。
値が小さいほど画像の類似度が高く、値が高いほど画像がの類似度はひくくなります。マッチングのアルゴリズムはAKAZEを使用しています。
一時間前との比較なので、17時は16時との差異を表しています。
この日は、2時から朝6時まで雪が降り続きました。表の赤字の部分です。その前提で考えると、画像処理をしない「無変換」でのマッチングがけっこういけてる気がします。まあ夜間はほぼ色がない写真となっているわけで、実質グレースケールとほぼ同じですが。
18時と朝7時で値が高くなっているのは、日が沈んで暗くなった時間と、日が昇って明るくなった時間です。こう考えると、やはり通知は夜だけに絞ったほうが精度が上がりそうです。
それから、上記のサイトを参考に明るさを正規化した画像を使って特徴点を計算した時に、検出できずにdivision zeroのエラーが良く出ました。この辺りはもとの画像に由来するのかもしれませんが(夜の写真なので正規化するとコントラストも弱くのっぺりした画像になってしまう)、他で使う時のためにちょっと覚えておこう。
無変換での写真の移り変わりと、特徴点の差を示すとこんな感じです。あ、今回の写真はあくまで例です。
時間 17:00
1時間前との差異 88
明るいせいで、細かいところまで見れるので、雪が降っていなくても一時間前と違いを検出しやすくなっているんじゃないでしょうか。
時間 18:00
1時間前との差異 130
まあ目で見ても、暗くなったため細部が見えなくなってますし、差が大きいのがわかります。
以降3時まであまり変化がありません。
時間 3:00
1時間前との差異 99
雪がうっすらつもり出しました。雪のせいで全体的に白っぽくなり、違いを検出できているようです。
こんな感じで、大体70くらいを閾値にすればいいんじゃなかろうか、ってことで実際に運用しているコードが次のものになります。画像の前処理をいろいろ試したときのコードはまた別の記事にしよう。ともかく、これで二つの画像の特徴点間の距離=差異の度合い、が出力される訳です。この理解であっているか、自信はないけど。
あとはもう少し雪が降れば、試行錯誤して精度を上げられそうなんですが、今年は雪が少ないですねー。