OpenCvによるWebカメラの使用
DelphiによるOpenCvの使用例が、インターネットに出ているので、ここでも取り上げてみました。
Delphiで、OpenCVの最新バージョンを利用する為には、C++のヘッダファイルを解析して、リンク用のユニット(xx.PAS)を作成する必要があります。
OpenCV 2.4.13は、Delphiで利用できるようにされたものが、https://github.com/Laex/Delphi-OpenCV からダウンロード出来ます。
又、インストール方法も書かれています。
しかし、OpenCVで用意されてる物の全てが利用できるようではないようです。
今回は、出来る限り簡単に利用する為、コンポーネントのインストールは行わず、上記からダウンロードした Delphi-OpenCV-master.zip を解凍し、その中の source ホルダーへDelphiのツールオプションでライブラリのパスを通すだけとします。
又、DLLファイルを Windows\System32 や Windows\SysWOW64 等にコピーしてシステムを汚くしてしまうのを避けます。
Delphi-OpenCV-masterだけでは、利用できません、更に version 2.4.13 OpenCV for Windows をダウンロードします。
このファイルは、実行形式となっています、実行すると、ファイルの解凍先を指定して、解凍するようになっています。
解凍すると、ギガ単位のフォルダーが作成されます。
今回、解凍されたファイルで利用するのは、DLLファイルだけなので、HDDのスペースの無駄をなくす為、DLLファイルだけ残して、他のものは消去してしまっても構いません。
DLLファイルには、VC11とVC12用があるのですが、此処での利用は VC12用です。
新しいバージョンでは、VC14になっているようですので注意してください。
今後もバージョンが更新されると思われるので、その時は新しいのを使用してください。
Windows 10 を利用している場合は、解凍後圧縮フォルダーにしてしまえば良いかと思います、zipフォルダーからDLLファイルを直接取り出すことができます。
手順、1
https://github.com/Laex/Delphi-OpenCV から"Delphi-OpenCV-master.zip" をダウンロードします。
clone or download ボタンで download zip を選択します。
手順、2
解凍して、その中の source ホルダーへ Delphiの ツール オプションでライブラリのパスを通します。
(必要に応じて sourceフォルダーの下のフォルダーにもパスを通します。)
手順、3
dllフィルが必要です(Files:
*2413.dll and *2413d.dll)
更に
opencv-2.4.13.exe をダウンロードします。(opencv-2.4.13-vc14の様に新しくなっています)
手順、4
ダウンロードしたファイル"opencv-2.4.13.exe" を実行して解凍します。
(解凍されるだけです。)
手順、5
必要に応じて、サンプルプログラムの実行ファイル(.EXE)を出力する為のフォルダーを作成します。
基本的には、ソースファイルのフォルダーに自動的に出力用フォルダーが作成されます。
(Delphiのバージョンによって異なります。)
手順、6
Delphiのサンプルプログラムを開きます。
手順、7
プロジェクトのオプションで、実行ファイルの出力先のフォルダーを作成した場合は出力先を指定します。
デフォルトの出力先で良い場合は必要ありません。
手順、8
プロジェクトの ビルドを行います。
手順、9
実行ファイルの出力先のフォルダーを開き、作成された実行ファイル(.exe)を選んで実行(ダブルクリック)します。
手順、10
*古いバージョン
DLLファイルが無いとエラー表示が出ますので、前記展開されたフォルダー"opencv/build/x86/vc12/bin"
又は"opencv/build/x64/vc12/bin"から表示されたDLLファイルを、実行ファイルのフォルダーへコピーします。
32ビットで構築するのか、64ビットなのかで使い分けますが、ファイル名が同じなので、実行ファイルのホルダーは、32ビットと64ビットでは別のホルダーの設定が必要です。
msv**120d.dllと表示されるファイルは、Delphi-OpenCV-master/redist/VC2013x86
又は VC2013x64の中から必要に応じてコピーします。
OpenCV-master/bin/win32 又は /win64の中のDllが必要になる場合もあります。
新しいバージョンでは、VCのバージョンも更新されているので、新しいDLLファイルを使用してください。
VC2015用のDllが必要でマイクロソフトから再頒布可能パッケージをダウンロードするようになっていますが、この中にはファイル名****D.DLLのデバッグ用DLLは含まれていません。
リリースバージョンのみなので、デバッグモードでも実行したい場合は、無料のVC2017をインストールする必要があります。
無料のVC2017をインストールすれば、再頒布可能パッケージは必要ありません。
VC2017のDllは、VC2015用として使用できます。
デバッグモードで必要なのは次のファイルですが、全て必要なわけではありません。
64ビット用と、32ビット用があり同じファイル名なので注意が必要です。
concrt140d.dll
mfc140ud.dll
mfcm140ud.dll
msvcp140d.dll
vcamp140d.dll
vccorlib140d.dll
vcomp140d.dll
vcruntime140d.dll
ucrtbased.dll
(手順、11)
( *.XML ファイルは、ここでダウンロードしたファイルに同梱されているものを、実行ファイルのフォルダーへコピーして下さい。
下記のサンプルでは必要ありません。)
以上で、ここでのサンプルプログラムは実行可能です。
サンプルプログラムは、Windows10 DelphiのバージョンXE7で検証しています。
Delphi-OpenCV-masterの中のサンプルプログラムを作成したOS、Delphi のバージョンが分からないのですが、Windows10 + Delphi XE7で実行する為には、若干の修正が必要のようです。
コンパイル時エラーが出なくても、正常に実行できないものが殆どです。
最初のサンプルプログラムは単に、WEBカメラの画像を表示するだけです。
Firemonkeyを使用すれば、簡単に表示が出来ますが、あえて、OpenCVを使用しています。
サンプルプログラム
VideoWidth、VideoHeightの値は、使用するWABカメラの解像度にあわせて下さい。
//********************************************* // OpenCV 2.4.13 ダウンロード先 // https://github.com/Laex/Delphi-OpenCV // http://opencv.org/downloads.html //********************************************* // カメラからの入力画像を表示します。 // カメラの仕様に合わせて VideoWidth, VideoHeight の値を変更します program cvImage2413; {$APPTYPE CONSOLE} uses winapi.Windows, Vcl.Forms, SysUtils, ocv.core_c, ocv.core.types_c, ocv.highgui_c; function GetConsoleWindow: HWND; stdcall; external kernel32; var HWD : HWND; key: Integer; Capture: PCvCapture; frameImage: PIplImage; windowNameCapture: PansiChar = 'Captureは、ESCキーで終了'; const VideoWidth = 1280; VideoHeight = 720; begin // コンソールWindowのハンドル取得 HWD := GetConsoleWindow; // 画面中央に位置をセット SetWindowPos(HWD, HWND_TOP, (Screen.Width - VideoWidth) div 2, (Screen.Height - VideoHeight) div 2, VideoWidth, VideoHeight, SWP_SHOWWINDOW); // カメラの初期化 // 0 は一台目のカメラ Capture := cvCreateCameraCapture(0); if Capture = nil then begin Writeln('カメラが見つかりません'); Writeln; Writeln('"Enter" キー で終了'); Readln; Exit; end; // ウィンドウの生成 // コンソールWindowの非表示 ShowWindow(HWD, SW_HIDE); // 表示設定 cvNamedWindow(windowNameCapture, CV_WINDOW_AUTOSIZE); // 画像のサイズ設定 cvSetCaptureProperty (Capture, CV_CAP_PROP_FRAME_WIDTH, VideoWidth); cvSetCaptureProperty (Capture, CV_CAP_PROP_FRAME_HEIGHT, VideoHeight); // 画像の表示 位置を設定するため1フレーム表示 frameImage := cvQueryFrame(Capture); cvShowImage(windowNameCapture, frameImage); cvWaitKey(5); // 画像表示位置の設定 cvMoveWindow(windowNameCapture, (Screen.Width - VideoWidth) div 2, (Screen.Height - VideoHeight) div 2); // cvResizeWindow(windowNameCapture, 1280, 720); // メインループ while True do begin // カメラからの入力画像1フレームをframeImageに格納 frameImage := cvQueryFrame(Capture); // 画像の表示 cvShowImage(windowNameCapture, frameImage); // escキーが入力されたらループを抜ける key := cvWaitKey(5); if Key = 27 then break; end; // キャプチャの解放 cvReleaseCapture(Capture); // ウィンドウの破棄 cvDestroyWindow(windowNameCapture); end.
このサンプルプログラムを実行する場合、実行ファイルの出力先フォルダーに次のDLLファイルが必要です。
新しいのをダウンロードした場合は、新しいDllファイルを使用してください。
下記例はVC12の場合です。
Debugモード時
msvcp120d.dll(新バージョンVC14 msvcp140d.dll VC2017インストール時は不用),opencv_core2413d.dll,opencv_highgui2413d.dll
Releaseモード時
msvcp120.dll(新バージョンVC14 msvcp140.dll VC2017インストール時は不用),opencv_core2413.dll,opencv_highgui2413.dll
Dllが不足している状態で、RAD Studio 内から実行しても、何も表示されず実効されない場合は、ビルドされた、実行ファイルを直接実行すれば、不足しているDLLファイル名が表示されます。