astel-labs.net

C#などのプログラミングTipsや雑記をつらつらと書くかもしれないブログです。

  • Home
RSS

複数カメラを利用したリアルタイム画像処理 Part3

Posted on 2010年10月13日 by Nymphaea
No CommentsLeave a comment

今回はカメラから取り込んだ画像を、ディストーションの補正と顔の検出を追加したサンプルです

利用したした web カメラは、サンワサプライの CMS-V27SET ×2です
ディストーションの補正に使用する設定ファイルは、このカメラであらかじめ作成しておいたものになります
接写用に補正がややきつくなっていますが、ほかのカメラでも補正した感じはわかると思います

ディストーション補正用の設定ファイルはカメラ毎に別途用意するべきですが、
サンプルではテストで利用したカメラが同じ製品のためコードの簡素化で敢えて共用しています
(同じ製品でもレンズの特性は若干異なる場合があり、安い製品の場合は特に品質にばらつきが大きい為)
(レンズ特性のばらつきを設定ファイルで補正できるレベルかどうかはさておき・・・・)

 

今回はおまけとしてサンプルコードに顔認識も追加していますが、こちらのコードは opencvsharp のサンプルコードをそのまま持ってきたものになりますので、特に解説は行いません

2台のカメラで同時に顔認識を行っているため処理もかなり重いです

 

 

まずはディストーション補正用の設定ファイルの作り方ですが、詳しい方法は OpenCV の公式サイト、書籍ではオライリージャパンの「詳解 OpenCV」などを参照してください

簡単に説明すると、「チェスボード」と呼ばれる白と黒の正方形のマスを印刷した用紙を、補正対象の web カメラで複数の方向から撮影した画像をソフトウェア処理することで、レンズの特性を計算で求めます(OpenCV – カメラキャリブレーション)

ここで注意しなければならないのが、チェスボードを撮影する枚数や撮影方向、画像にチェスボードを写す位置を考慮しながら補正用画像を撮っていかなければ、ディストーション補正後の画像に補正のムラができてしまいます
(四隅などの外縁部であまり補正が効いていないなど)

最低の撮影枚数などは理論的な根拠がヘルプなどで明示されていますが、方向や撮影位置などはそれなりに試行錯誤をしながら、最終的に許容できるレベルを決めて、そのレベルに達しているかをきちんと測定できる方法を考えておかなければ、使用するカメラの台数分試行錯誤しなければならなくなってしまうので、なんらかの測定目的でディストーション補正する場合には注意が必要です

わたしはディストーション補正後の画像の幾何特性を測るソフトを作成し、複数撮影した画像から補正に効いている画像の組み合わせで、補正ファイルを作成する方法をとりました

また、安い web カメラはピント調整でもレンズ特性が変化する場合があるため、撮影距離毎にも補正ファイルを用意したほうが良い場合もあります
(そもそも光軸が狂っているなど)

 

 

ディストーション補正の設定ファイルが出来たとして、実際に補正を行った画像が以下になります

(上:補正前画像、下:補正後画像)

 

補正前と比較して、補正後はチェスボード画像の四辺が直線的になっていることが何となくわかると思います

サンプルコードに添付している設定ファイルを使ったものですが、この設定ファイルもわたしが家でソフトの検討段階で試行錯誤しながら作成したものなので、よくよく見ると補正にムラがあることが確認できます
(最終的に作成した補正ファイルは会社の資産を利用して作成しているので勝手に外部に公開できない)

 

ともあれ、ディストーションを補正して歪みが少なくなったら、あとは透視変換(透視投影)を行ってカメラと撮影対象との傾きを補正することで、より正確に画像から距離を算出することができるようになりますが、透視変換は基準となる4点を画像から検出する必要があり、撮影後の画像を利用するなどもうひと手間かかってしまうので、詳しくは OpenCV のサンプルを参照しながら実装してみてください
基準となる4点の検出は、チェスボードをそのまま流用して座標を取得すると簡単です

透視変換を行うことで、例えば正方形の模様が描かれた絵をカメラで撮影した際に、カメラが傾いていると撮影した正方形がカメラが写した角度によって菱形や平行四辺形、台形やそれ以外の方形に歪んでしまった画像をソフトウェア処理によって元の正方形に補正することができます

菱形や平行四辺形、台形であれば、透視変換ではなくアフィン変換でもっと簡単に補正することができますが、それ以外の方形ではアフィン変換では補正できないため、透視変換を利用する必要があります

 

 

これで、web カメラから画像を取り込み、ディストーションを補正し、(サンプルに実装していませんが)透視変換を行うことで、画像から対象物を検出して測定する準備が整いました

添付するサンプルコードには、Part1 で宣言していた通り OpenCV 関連のアセンブリが含まれない形での配布になりますので、利用前に組み込んでからビルドを行ってください(サンプルに実行ファイルは含まれていません)

 

 

バイナリ
・CamSample02.zip <VisualStudio2010 / .net Framework 3.5>

Categories: C#, OpenCV, プログラミング

 

WPF – トグル表示可能なボタンの作成
複数カメラを利用したリアルタイム画像処理 Part2

コメントを残す

コメントを投稿するにはログインしてください。

  • 2010年10月
    日 月 火 水 木 金 土
     12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31  
    « 9月   11月 »
  • 最近の投稿

    • raspberry pi に nginx をセットアップする
    • VSCode を日本語化する
    • raspberry pi に VSCode をインストールする
    • WindowsのプロダクトIDを取得する
    • SQL Server – money型とdecimal型を併用した金額計算
  • アーカイブ

    • 2020年3月
    • 2016年12月
    • 2014年6月
    • 2014年5月
    • 2013年7月
    • 2012年11月
    • 2012年7月
    • 2012年5月
    • 2012年4月
    • 2011年4月
    • 2011年1月
    • 2010年11月
    • 2010年10月
    • 2010年9月
    • 2010年8月
    • 2010年7月
    • 2010年6月
    • 2010年5月
    • 2010年4月
  • カテゴリー

    • C#
    • jQuery
    • OpenCV
    • raspberry pi
    • SharePoint
    • Silverlight
    • SQL Server
    • WCF
    • WPF
    • プログラミング
    • 未分類
    • 雑記
© astel-labs.net. Proudly Powered by WordPress | Nest Theme by YChong

このブログ内で公開されているソースコードおよびサンプルプログラムに関わるライセンスはすべて修正BSDライセンス(New BSD License)として公開しています。
但し、サンプルプログラムに含まれる外部アセンブリが同様のライセンスとは限りませんので、利用する前に必ずすべてのライセンスの確認を行ってください。