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ファイル名が表示されます。

    download cVImage2413.zip

画像処理一覧へ戻る

      最初に戻る