2021年10月15日金曜日

VC++ デバイス情報の取得

 現在、Yolo(darknet)による画像(物体)認識にトライしています。

ようやく、USBカメラ映像に対する処理プログラムの切り出しに目途が立ったところです。

そこで、プログラム内部で、PCに接続したカメラを特定し、そのカメラ映像を処理するようにしたいと思ったのですが、私にとって結構な難題であったので、以下にその手法について述べます。


デバイスリスト表示プログラムの作成

◎プロジェクトプロパティの設定

              C/C++/プリプロセッサ        INITGUID
              C/C++/詳細設定/「指定の警告を無効にする。」 4996
              〇リンカー/入力              setupapi.lib        

 ◎コーディング

           〇インクルードファイル指定 setupapi.h、devguid.h 、devpkey.h

           〇使用関数  SetupDiGetClassDevs、SetupDiEnumDeviceInfo、SetupDiGetDeviceProperty

◎デバイス情報の取得 

    〇クラスGUID は devguid.h で定義されています。

    〇要求する情報の種別は devpkey.h で定義で定義されています。


    〇プログラムソース

   以下はデバイス情報取得用のテストコードです。

/******************************************/

#include <iostream>

#include <windows.h>

#include <setupapi.h>

#include <devguid.h>

#include <devpkey.h>


void TransBuff(BYTE* buff);


int main()

{

    std::cout << "Hello World!\n";

    HDEVINFO hDevInfo;


    if (false) {

        //全デバイス

        hDevInfo = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT);

    }

    else {

        //カメラ限定

        hDevInfo = SetupDiGetClassDevs(&GUID_DEVCLASS_CAMERA, NULL, NULL, DIGCF_PRESENT);

    }

    DWORD index = 0;

    SP_DEVINFO_DATA DeviceInfoData = { 0 };

    DeviceInfoData.cbSize = sizeof(DeviceInfoData);


    BYTE Buffer[4096];

    // Get device info data

    while (SetupDiEnumDeviceInfo(hDevInfo, index, &DeviceInfoData)) {

        DEVPROPTYPE PropType;

        if (true) {

            SetupDiGetDeviceProperty(

                hDevInfo,

                &DeviceInfoData,

                &DEVPKEY_Device_FriendlyName,       // プリプロセッサ INITGUID が必要

                &PropType,

                Buffer,

                sizeof(Buffer),

                NULL,

                0);

        }

        else {

            // DEVPKEY_Device_HardwareIds


            SetupDiGetDeviceProperty(

                hDevInfo,

                &DeviceInfoData,

                &DEVPKEY_Device_HardwareIds,       // プリプロセッサ INITGUID が必要

                &PropType,

                Buffer,

                sizeof(Buffer),

                NULL,

                0);

        }

         if (DeviceInfoData.ClassGuid.Data1 == (GUID_DEVCLASS_CAMERA).Data1) {

            std::cout << "Found Cammera ";


            if (PropType == DEVPROP_TYPE_STRING || PropType ==(MAX_DEVPROP_TYPEMOD| DEVPROP_TYPE_STRING)) {

                TransBuff(Buffer);

                std::cout << Buffer;

            }

            std::cout << "\n";

        }

        else if (DeviceInfoData.ClassGuid.Data1 == (GUID_DEVCLASS_DISPLAY).Data1) {

            std::cout << "Found Display ";


            if (PropType == DEVPROP_TYPE_STRING || PropType == (MAX_DEVPROP_TYPEMOD | DEVPROP_TYPE_STRING)) {

                TransBuff(Buffer);

                std::cout << Buffer;

            }

            std::cout << "\n";

        }

        else if (DeviceInfoData.ClassGuid.Data1 == (GUID_DEVCLASS_MOUSE).Data1) {

            std::cout << "Found Mouse ";


            if (PropType == DEVPROP_TYPE_STRING || PropType == (MAX_DEVPROP_TYPEMOD | DEVPROP_TYPE_STRING)) {

                TransBuff(Buffer);

                std::cout << Buffer;

                std::cout << "\n";

            }

        }

        index++;

   }

    SetupDiDestroyDeviceInfoList(hDevInfo);

}


void TransBuff(BYTE* buff) {

    int ip = 0;

    int ip2 = 0;

    for (int i = 0;; i++) {

        ip = i;

        ip2 = i * 2;

        buff[ip] = buff[ip2];

        if (buff[ip2] == 0x00) {

            break;

        }

    }

    return;

}

/*****************end code**********************/

◎実行結果

        〇カメラのデバイス情報 

ノートPC内臓カメラ
















USBカメラ










        〇テストプログラム実行結果
デバイス名表示











デバイスID表示














0 件のコメント:

コメントを投稿