ここ最近、画像処理関連のお仕事を行っていたので、そのメモです
ふとした相談で、現在工業用カメラを用いて機器の測定を行っているものを、そこそこの精度でいいから安くできないか? と言われたことから、今回の結構大変だったソフト作成が始まったのでした・・・
事の始まりは、工業用カメラで 0.2mm の隙間を10万分の 1mm という精度で測定していたものを、別用途で50分の 1mm 程度の精度でよいからということで、安い web カメラ(USB カメラ)で接写した画像を処理することで測定したらどうかと提案してしまったのです
工業用カメラは画像解像度が高く、ディストーション(歪曲収差)と呼ばれるレンズの特性からくるレンズ外縁部の画像の歪みが少ないため、非常に高価です(会社で使っていたものは1台300万円以上らしいです)
工業用の距離測定カメラはどんなに安くても10万程度するため、ちょっとした検討で複数台を使った装置を作ろうとすると、画処理用FA機器と組み合わせると100万円単位で費用が発生してしまいます
一方で、web カメラといえば近くの量販店に行けば3000円~8000円程度で買えるカメラですが、工業用カメラとは対照的に画像解像度は低く(3000円の web カメラで 640×480 程度)、ディストーションが大きく測定用途では歪みが影響しすぎて普通は使えません
しかし、画処理をPC上で行うことができれば、実質の費用は web カメラ数台分で済んでしまいます
(わたしが作成したものは、カメラを含むシステムよりメカ屋さんが作成した固定用の置台のほうが高くついてます・・・)
今回の測定ではそれほど精度が高い必要はないので、精度については接写することで満足できそうですが、ディストーションの影響は可能な限り小さくなるように補正する必要があります
そこで、OpenCV というオープンソースの画像ライブラリを組み合わせて利用することにより、ディストーションを補正して安い web カメラでもそこそこの精度で測定ができるようになります
今回のお話はかなり長くなるので、数回に分けてのお話になります
Part 1 では、カメラを扱う前の画処理について OpenCV をプロジェクトに組み込む方法を説明します
OpenCV そのものは C言語で書かれているため、C#で扱うにはちょっと面倒です
(以前はVisual C/C++ を使っていたので、全部 C言語で書くのもアリなのですが、この後のことも考えて C# で書きたかったんです・・・)
そこで、C# で OpenCV を簡単に扱うには、opencvsharp を利用するのがとても便利です
opencvsharp は、C# で OpenCV を扱うためのラッパー DLL になっており、ネイティブ関数とほぼ同様の呼び出し方が可能なため、参考書を見る際にも、容易にコードを移植可能です
アセンブリをダウンロードするには、トップページ右側の「Featured downloads」から、「OpenCvSharp-2.1-x86-20100808.zip」または「OpenCvSharp-2.1-x64-20100808.zip」をダウンロードします(2010/09/24現在の最新バージョン)
この時、一緒に「Sample-2.1-20100808.zip」もダウンロードしておきましょう
必要なアセンブリが同梱されていますので、本家サイトから OpenCV のコードをダウンロードしてコードをコンパイルする手間が省けます
※ OpenCV と opencvsharp を利用したプログラムを頒布する際は、ライセンスにご注意ください!
OpenCV は「BSD license」、opencvsharp は「GNU Lesser General Public License」への同意が必須です
ここからはプロジェクトの作成を行います(以降、x86 バージョンでの説明)
○Visual Studio を立ち上げて、.net のバージョンを 2.0 以降を選択してプロジェクトを作成します
(2010/09/28 追記:ver2.1 を利用する場合には、.net 3.5 以降を選択する必要があります)
○「Sample-2.1-20100808.zip」を展開し、ルートフォルダから「cv210.dll」、「cvaux210.dll」、「cxcore210.dll」、「highgui210.dll」、「ml210.dll」、「opencv_ffmpeg210.dll」、「OpenCvSharpExtern.dll」をコピーして、作成したプロジェクトのルートフォルダにコピーします
○作成したプロジェクトに、コピーした「cv210.dll」以下のアセンブリをすべて、「プロジェクト」メニューの「既存項目の追加」からファイルを追加します
○プロジェクトに追加した各アセンブリの「プロパティ」を表示して、「詳細」の「出力ディレクトリにコピー」設定を「新しい場合はコピーする」を選択しておきます
(ここは非常に重要 設定していない場合、実行時にエラーダイアログが表示されます)
○「OpenCvSharp-2.1-x86-20100808」を展開し、プロジェクトの「参照設定」の「参照の追加」から、「OpenCvSharp.dll」、「OpenCvSharp.Blob.dll」、「OpenCvSharp.CPlusPlus.dll」、「OpenCvSharp.DebuggerVisualizers.dll」、「OpenCvSharp.Extensions.dll」、「OpenCvSharp.MachineLearning.dll」、「OpenCvSharp.UserInterface.dll」を追加します
(Visual Studio 2010 / .net Framework 4.0 で作成した例。不要な参照が多いのは気にしない)
あとは「Sample-2.1-20100808.zip」に同梱されているサンプルコードを参照しながら、実際にコードを書けば OpenCV の機能が利用できるようになります
利用する API の種類により、先ほどプロジェクトに追加したり参照設定した各アセンブリやライブラリは除外することが可能です
OpenCV と opencvsharp の各サイトよりドキュメントを参照してください
また、opencvsharp を利用するにはサイトの注意にも書いてありますが、Visual C++ 2008 SP1 Redistributable Package / Visual C++ 2005 SP1 Redistributable Package をインストールしておく必要があります
次回以降で紹介予定のコードとサンプルプロジェクトには、OpenCV と opencvsharp のアセンブリとライブラリは含めない形式で公開予定です
サンプルプロジェクトのビルド前にはアセンブリをダウンロードし、必ず上記手順で各アセンブリを追加するようにしてください
OpenCV を利用する準備が整ったところで今回は終了です
次回は、web カメラを利用して画像を取り込む方法を解説します
コメントを残す
コメントを投稿するにはログインしてください。