現在、Yolo(darknet)による画像(物体)認識にトライしています。
ようやく、USBカメラ映像に対する処理プログラムの切り出しに目途が立ったところです。
そこで、プログラム内部で、PCに接続したカメラを特定し、そのカメラ映像を処理するようにしたいと思ったのですが、私にとって結構な難題であったので、以下にその手法について述べます。
デバイスリスト表示プログラムの作成
◎プロジェクトプロパティの設定
〇インクルードファイル指定 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 件のコメント:
コメントを投稿