Webカメラの入力イベントをキーボードのキーに再マッピングする

Webカメラの入力イベントをキーボードのキーに再マッピングする

私は、アプリケーションに特定のタスクを実行させるようにWebカメラのトリガーから入力を読み取る必要があるアプリケーションを開発しています。

このプロジェクトにはQTサポートで構築されたOpenCVが含まれており、このトリガーを適用するとランダムな競合が発生します(ASSERT:qasciikey.cppファイルの「false」、495行)。

だからもっと簡単で信頼性の高い方法は、外部トリガーをキー(特にスペースバー)にマッピングすることだと思います。したくない書くスペースバーを押すと、トリガーがスペースバーを押したように見えます。

これまでevtestを使用してデバイスを選択しました。

/dev/input/event13: See3CAM_CU51

カメラを起動すると、次のものが表示されます。

Event: time 1507757166.472300, type 1 (EV_KEY), code 212 (KEY_CAMERA), value 1
Event: time 1507757166.472300, -------------- SYN_REPORT ------------
Event: time 1507757167.147649, type 1 (EV_KEY), code 212 (KEY_CAMERA), value 0
Event: time 1507757167.147649, -------------- SYN_REPORT ------------

「値1」はピンが高く引っ張られている場合(トリガされている場合)、「値0」はピンが切り離された場合です。そのため、KEY_CAMERAをスペースバーに再マップすることができますが、Ubuntu 16.04でこれを行う最もきちんとした方法はわかりません。

キーボードデバイスを選択するとき:

/dev/input/event4: AT Translated Set 2 keyboard

スペースバーを押すと、次のような結果が出力されます。

Event: time 1507757327.011812, -------------- SYN_REPORT ------------
Event: time 1507757328.818177, type 4 (EV_MSC), code 4 (MSC_SCAN), value 39
Event: time 1507757328.818177, type 1 (EV_KEY), code 57 (KEY_SPACE), value 1
Event: time 1507757328.818177, -------------- SYN_REPORT ------------
Event: time 1507757328.896970, type 4 (EV_MSC), code 4 (MSC_SCAN), value 39
Event: time 1507757328.896970, type 1 (EV_KEY), code 57 (KEY_SPACE), value 0

私はhwdb udevファイルの作成について読みましたが、あるデバイスから別のデバイスに入力をマップする方法が見つかりませんでした。可能ですか?これを達成する最も簡単な方法は何ですか?

よろしくお願いします。

ベストアンサー1

正解は、おそらく[hwdb]ファイルを書くことによって KEY_CAMERAKEY_SPACEこれ例のように見えますが、ディテールが少し不足していますね。

ファイル形式は、主にファイルの頭部/usr/lib/udev/hwdb.d/60-keyboard.hwdb(私のシステムの場合)のコメントに記載されています。アーキテクチャLinuxこれに関する議論。この形式はsystemdのバージョンによって異なりますので、自分のファイルを確認してください。入力デバイスを次の3つのモードのいずれかに合わせることができます。

  • ユニバーサル入力デバイスの一致:

      evdev:入力:bZZZZvYYYYpXXXXeWWWW-VVVV

    これは入力デバイスのカーネルモーダルエイリアスと一致します。デフォルトでは、ZZZZはバスID(/usr/include/linux/input.h BUS_ *を参照)、YYYY、XXXX、およびWWWは4桁の16進大文字プロバイダ、製品およびバージョンID、およびVVVVはデバイス機能を記述する任意の長さです。入力フォームです。

  • ATキーボードDMIデータマッチング:

      evdev:atkbd:dmi:bvn*:bvr*:bd*:svn行商人:pn製品:個人映像*

    VendorとProductは、カーネルDMIモーダルからエクスポートされたファームウェアによって提供される文字列です。

  • 一致するドライバデバイス名とDMIデータを入力してください。

      evdev:名前:デバイス名を入力してください:dmi:bvn*:bvr*:bd*:svn行商人:pn*

    入力デバイス名はドライバによって指定されたデバイス名であり、ベンダはカーネルDMIモダリアからエクスポートされたファームウェアによって提供される文字列です。

もう1つの可能性は、evtestのようにWebカメライベントストリームを読み取り、キーが表示されたらKEY_SPACE別のイベントストリームに挿入する小さなプログラムを作成することです。これに関するより多くのドキュメントとそのようなPythonの例がたくさんあるようです。地図時間イベント注入のための作品。

おすすめ記事