赤外線カメラでの Windows Hello の例
[一部の情報はリリース前の製品に関することであり、正式版がリリースされるまでに大幅に変更される可能性があります。本書に記載された情報について、Microsoft は明示または黙示を問わずいかなる保証をするものでもありません。]
このサンプルでは、赤外線ビデオ カメラで Windows Hello を有効にするための、 Windows.Devices.Perception.Provider インターフェイスの基本的な実装について説明します。
特に、このサンプルでは次の方法について説明します。
- 赤外線フレームを Windows 10 センサー データ サービスに配信するために、IPerceptionFrameProvider と IPerceptionFrameProviderManager を実装する。
- IPerceptionFrameProvider を操作し、デバイス固有のプロパティを渡すために、モジュールを実装する。
- 顔認証が有効になるように IPerceptionFrameProvider プロパティを設定する。
- プロパティ変更要求に応答する。具体的には、要求を処理して、カメラの ExposureCompensation プロパティを変更します。
- メディア キャプチャ機能を使ってビデオ キャプチャ デバイスを列挙する。
- メディア ファンデーションの IMFSourceReader を使ってキャプチャ ストリームを開く。
- YUY2 ビデオ フレームをメディア ファンデーション API から読み取り、それらのフレームを 8 ビット グレースケールに変換する。また、それらのフレームを Windows 10 センサー データ サービスに配信する。メディア ファンデーションについて詳しくは、Microsoft メディア ファンデーションに関するページをご覧ください。
前提条件
システム要件
- Windows 10 (バージョン 1511)
- Visual Studio Community 2015
- Windows 10 スタンドアロン SDK (Visual Studio と共にインストールしていない場合)
- Windows Driver Kit (WDK)
サンプルをダウンロードする
サンプルを、GitHub のパートナー アプリケーション開発リポジトリからダウンロードします。
このサンプルは、IPerceptionFrameProvider の実装のサンプルであり、さまざまなキャプチャ デバイスで動作するように作成されています。このサンプルは、デバイス固有のプロバイダーを開発するための出発点として使うことができます。デバイスやシナリオによっては、その他の プロパティや機能を追加する必要があります。
この IPerceptionFrameProvider のサンプルを利用するには、センサーが次の要件を満たす必要があります。
- 赤外線センサーは、Web カメラなどの標準的な Windows のメディア デバイスとして機能する必要があります。
- センサーは、YUY2 ビデオ モードをサポートしている必要があります。
- ビデオ フレームは固定サイズにする必要があり、インター レース化することはできません。
サンプルのプロバイダーでは、列挙中に最初の有効なビデオ キャプチャ デバイスが選ばれます。そのため、対象となるセンサーは、 PC で利用可能な唯一のデバイス (統合された Web カメラなど) であることが必要です。
重要
このサンプルにはコンパイラのマクロが含まれています。このマクロによって、デバッグ ビルドやリリース ビルド用にさまざまなデバイスの列挙機能が生成されます。デバッグ用に生成する場合、サンプルでは、デバイスを検索して接続するための単純な列挙方法を使います。この列挙方法では、すべての UVC キャプチャ デバイスが列挙され、最初の互換性のあるデバイスが選ばれます。この方法は、赤外線カメラをオンにし、センサー データ サービスを使って動作させる作業をすぐに始めることができるようにするためのものです。これに対して、リリース ビルドの場合は異なる列挙方法が使われます。この方法では、特定の PID や VID と照合するデバイスのクエリが作成されます。これにより、1 つのデバイスだけが返されます。サンプルに含まれる VID と PID はダミーの値であるため、この方法を利用するには、ユーザー独自のデバイスの値に置き換える必要があります。
レジストリ キーをインストールする
レジストリ キーを使って、IPerceptionFrameProvider モジュールのパスと、センサー データ サービス向けの ActivationClass の名前を指定します。このサンプルにはキーが含まれていますが、手動でインストールする必要があります。キーをインストールするには、次の手順を実行します。
エクスプローラーを使って、サンプルのプロジェクト フォルダー内にある "FrameProviderSample.reg" ファイルを探します。
このファイルを右クリックし、[結合] を選んでキーをインストールします。
[ユーザー アカウント制御] ダイアログ ボックスで [はい] を選び、このアプリによる PC への変更を許可します。
レジストリ エディターの警告ダイアログで [はい] を選び、次へ進みます。
キーが "HKLM\Software\Microsoft\Analog\Providers\MediaFoundation" にインストールされます。
SampleMft0 モジュールのインストール
SampleMft0 モジュール プロジェクトには、カメラの Windows ストア デバイス アプリで使うためのドライバーである、メディア ファンデーション トランスフォーム (MFT) が用意されています。ドライバー MFT は、特定のカメラでビデオをキャプチャするときに使います。そのため、このサンプルを完全に機能させるには、お使いの特定のデバイス用にドライバー コードを記述する必要があります。
IPerceptionFrameProvider の基本的な操作 (センサー データ サービスにフレームを渡す操作) では、SampleMft0 モジュールをインストールする必要はありません。ただし、Windows Hello をエンド ツー エンドで動作させるには、デバイス固有の機能を追加するために、ActiveIlluminationEnabled プロパティを使って IR フレームにタグ付けする必要があります (「Windows Hello チェック リスト」をご覧ください)。SampleMft0 プロジェクトでは、この要件を実装する際に利用できる 1 つの方法が示されます。この方法では、SampleMft0 モジュール内で LED の照射状態を読み取り、フレームを使って属性を IPerceptionFrameProvider に渡します。最初に、デバイスの状態を読み取るように SampleMft0 プロジェクトを変更して、属性を適切に設定する必要があります。これにより、SampleMft0 が正しく動作します。
注 フレームに照射状態のタグを付けるための方法は、SampleMft0 の使用だけではありません。また SampleMft0 は、必ずしも 推奨される方法というわけではありません。
ARM 用にビルドするには、次の手順を実行します。
SampleMft0 ソリューションを開いてビルドする
構成マネージャーを使って、[アクティブ ソリューション プラットフォーム] のドロップダウン ボックスで [<新規作成...>] を選びます。[新しいプロジェクト プラットフォーム] ダイアログ ボックスの [新しいプラットフォーム] で、[ARM] を選び、[OK] をクリックします。
SampleMft0 プロジェクトのプロジェクト プロパティを開き、次の手順を実行します。
- [構成プロパティ]、[全般] の順に展開し、[ATL の使用] を [ATL に静的にリンク] に設定します。
- [構成プロパティ]、[C/C++]、[コード生成] の順に展開し、[ランタイム ライブラリ] を [マルチスレッド (/MT)] に設定します。
- [リンカー]、[入力] の順に展開し、[特定の既定のライブラリの無視] を shlwapi.lib と urlmon.lib を含めるように編集します。
FrameProviderSampleMft0.dll を C:\Program Files (x86)\FrameProviderSampleMft0 にコピーします (32 ビット システムの場合は、C:\Program Files\FrameProviderSampleMft0)。
管理者のコマンド プロンプトを開き、DLL の新しい場所に移動します。
FrameProviderSampleMft0.dll で regsvr32 を実行します。
x64 システムでは、x64 バージョンの DLL を作成して手順 3. ~ 5. を繰り返し、64 ビットの DLL を C:\Program Files\FrameProviderSampleMft0 にコピーします。
regedit を実行し、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses\ にある、カメラのデバイス レジストリ キーを開きます。
次の例は、カメラのデバイス レジストリ キーへのパスを示しています。カメラには別のデバイス ID が設定され、デバイス クラスが異なる場合があります。
HKEY_LOCAL_MACHINE\ SYSTEM\ CurrentControlSet\ Control\ DeviceClasses\ {E5323777-F976-4f5b-B94699C46E44}\ ##?#USB#VID_O45E&PID075d&MI_00#8&23C3DB65&0&0000#{E5323777-F976-4f5b-9b550B94699C46E44}\
レジストリ エディターで、GLOBAL#\Device Parameters キーに CameraPostProcessingPluginCLSID 値を追加し、その値を {DDBE4BC1-541F-4D43-A25B-1F23E7AF4505} に設定します。これが、SampleMFT0 プロジェクトで定義された Driver MFT の CLSID です。
サンプルのビルドと展開
- Visual Studio で FrameProviderSample ソリューション (.sln) を開きます。
- [ビルド]、[ソリューションのビルド] の順に選びます。
- [ソリューション エクスプローラー] ウィンドウで、[FrameProviderSample] プロジェクトを右クリックし、[エクスプローラーでフォルダーを開く] を選びます。
- (ビルド構成に応じて) FrameProviderSample の出力フォルダーを開きます。64 ビット OS で実行する場合は、x64 ビルドを使ってください。構成に従って、このサンプルでは Debug フォルダーに出力されます。
- "%SystemDrive%\Analog\Providers"という新しいディレクトリを作成します。
- "SampleFrameProvider.dll" を "%SystemDrive%\Analog\Providers" にコピーします。
- [設定]、[アカウント]、[サインイン オプション] の順に移動し、Windows Hello セットアップ アプリを起動して、 センサー データ サービスを開始します。これにより、プロバイダーの DLL が読み込まれます。
- 登録中に、ビジュアライザーでセンサーからのフレームを確認します。
注 これらのキーが見つからないまたは一致しない場合、FrameProviderSample は機能しません。次のいずれかを変更した場合は、 これらのキーを必ず更新してください。
- FrameProviderSample の DLL のファイル名には、"SampleFrameProvider.dll" を使います。
- FrameProviderSample DLL へのファイル パスには、"%SystemDrive%\Analog\Providers" を使います。
- IFrameProviderManager を実装するクラスの名前には、名前空間を含めて、 "MediaFoundationProvider.SampleFrameProviderManager" を使います。