DelphiでWebカメラからQRコードを読み取る方法|ZXing.Delphi+DSPack実装ガイド
DelphiでWebカメラからQRコードやバーコードを読み取るには、ZXing.DelphiとDSPackを組み合わせることで実現できます。
このページでは、VCLアプリケーションとしてのフォーム設計、ライブラリの導入手順、イベント設定、そして実際の読み取り処理までを、サンプルコード付きで詳しく解説します。
画像ファイルではなく、リアルタイム映像からの読み取りを行いたい方に最適な内容です。
QRコード リーダーをお探しの場合
WindowsパソコンでQRコード リーダーのフリーソフトをお探しの場合は
Mam WebCam QR Code Reader をダウンロードして使用してください。
ブラウザでQRコードを読み取りをお探しの場合は
【無料】JavaScriptでQRコードリーダーを作る方法(Webカメラ対応)で読み取り可能です。
初めに
ZXing.Delphi(https://github.com/Spelt/ZXing.Delphi)を使うと画像から
QRコードやCode39バーコードなどの画像をスキャンして文字に変換することができます。
DSPackを使うとWEBカメラから画像を取得することができます。
DSPackのDelphi IDEへのインストール方法は https://mam-mam.net/delphi/dspack_install.html を参考にしてインストールしていることとします。
この2つを使うとカメラからQRコードを読み取る Windows用QRコードスキャナ アプリケーション ソフトウェアを作ることができます。
ZXing.Delphiダウンロード
https://github.com/Spelt/ZXing.Delphi
から「Code」⇒「Download Zip」をクリックして「ZXing.Delphi-v_3.0.zip」ファイルをダウンロードします。
ダウンロードしたファイルを解凍しておきます。
DelphiでQRコードリーダーを作る準備手順
Delphi IDEを起動したら[ファイル]⇒[新規作成]⇒[Windows VCL アプリケーション -Delphi]をクリックして新規プロジェクトを作成します。
すべて保存ボタンを押して、
..\ドキュメント\Enbarcadero\Studio\Projects
に[新しいフォルダー]ボタンを押して「Vcl_ZXing_DSPack」等のプロジェクト保存用のフォルダを作成します。
プロジェクト保存用フォルダ内にユニット「Unit1.pas」で保存し、プロジェクト「Project1.dproj」で保存します。
「ZXing.Delphi-v_3.0.zip」ファイルを解凍した中にある「Lib」フォルダを
プロジェクトフォルダ「..\ドキュメント\Enbarcadero\Studio\Projects\Vcl_ZXing_DSPack」にフォルダごとコピーします。
プロジェクトの設定
[プロジェクト]⇒[オプション]をクリックします。
- 左ペインで[ビルド]⇒[Delphi コンパイラ]を選択します
- ターゲットで[全ての構成]を選択します
-
[条件定義]に以下を入力します
FRAMEWORK_VCL
(入れ忘れて一度でもコンパイルしてエラーが出たときは[条件定義]に FRAMEWORK_VCL を入れてから[プロジェクト]⇒[全てのプロジェクトをビルド]をクリックします) -
[検索パス」に以下を入れます
Lib\Classes;Lib\Classes\Common;Lib\Classes\Common\Detector;Lib\Classes\Common\ReedSolomon;Lib\Classes\Filtering;Lib\Classes\1D Barcodes;Lib\Classes\2D Barcodes;Lib\Classes\2D Barcodes\Decoder;Lib\Classes\2D Barcodes\Detector - 追加したら[保存]ボタンをクリックします。
VCLフォームに必要なコンポーネント一覧
フォームに以下のコンポーネントをドラッグ&ドロップで配置します
- TVideoWindow
- TFilterGraph
- TFilter
- TSampleGrabber
- TTimer
- TMemo
QRコード読み取り処理の実装例(ZXing+DSPack)
以下ソースコードをコピーして貼り付けます。
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls,
DSPack, DXSUtil, DirectShow9,
ZXing.ReadResult, ZXing.BarCodeFormat, ZXing.ScanManager;
type
TForm1 = class(TForm)
VideoWindow1: TVideoWindow;
FilterGraph1: TFilterGraph;
Filter1: TFilter;
SampleGrabber1: TSampleGrabber;
Memo1: TMemo;
Timer1: TTimer;
procedure FilterGraph1GraphVideoSizeChanged(sender: TObject; Width,
height: Word);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FilterGraph1GraphVideoSizeChanged(sender: TObject; Width,
height: Word);
begin
VideoWindow1.Width:=320;
VideoWindow1.Height:=320*Height div Width;
end;
procedure TForm1.FormCreate(Sender: TObject);
var ICapB:ICaptureGraphBuilder2;
VideoDevices:TSysDevEnum; //取り込みビデオデバイスの列挙
begin
Timer1.Enabled:=False;
VideoDevices:=TSysDevEnum.Create(CLSID_VideoInputDeviceCategory);
try
Filter1.FilterGraph:=FilterGraph1;
Filter1.BaseFilter.Moniker:=VideoDevices.GetMoniker(0);
VideoWindow1.FilterGraph:=FilterGraph1;
SampleGrabber1.FilterGraph:=FilterGraph1;
FilterGraph1.ClearGraph;
FilterGraph1.Mode:=gmCapture;
FilterGraph1.Active:=True;
ICapB:=FilterGraph1 as ICaptureGraphBuilder2;
ICapB.RenderStream(@PIN_CATEGORY_PREVIEW,nil,Filter1 as IBaseFilter,
SampleGrabber1 as IBaseFilter,VideoWindow1 as IBaseFilter);
FilterGraph1.Play;
Timer1.Enabled:=True;
finally
VideoDevices.Free;
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FilterGraph1.Stop;
FilterGraph1.Active:=False;
FilterGraph1.ClearGraph;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var bmp:TBitmap;
ScanManager:TScanManager;
ReadResult: TReadResult;
begin
bmp:=TBitmap.Create;
try
SampleGrabber1.GetBitmap(bmp);
ScanManager:=TScanManager.Create(TBarcodeFormat.Auto,nil);
try
ReadResult:=ScanManager.Scan(bmp);
if ReadResult<>nil then
Memo1.LInes.Add(ReadResult.text);
finally
ScanManager.Free;
end;
finally
bmp.Free
end;
end;
end.
イベントプロパティにプロシージャを割り当てます。
| イベントプロパティ | プロシージャ |
|---|---|
| Form1.OnCreate | FormCreate |
| Form1.OnDestroy | FormDestroy |
| FilterGraph1.OnGraphVideoSizeChanged | FilterGraph1GraphVideoSizeChanged |
| Timer1.OnTimer | Timer1Timer |
実行する
アプリケーションをコンパイルして実行します。
カメラにQRコードやCode39バーコードなどを映すとスキャンしてMemo1に出力します。
