Навчальний посібник: перерахування модулів і камер

Перерахування функціональних модулів і декількох камер — важливий компонент логіки додатка для вибору потрібного пристрою. У цьому навчальному посібнику описано метод перерахування модулів і декількох пристроїв, щоб можна було вибрати потрібне з них.



Виявлення камер, підключених до системи, і визначення можливостей цих камер можна спростити за допомогою перерахування пристроїв. Intel RealSense SDK 2016 R1 надається механізм з допомогою PXCSession::ImplDesc PXCCapture::DeviceInfo, завдяки якому розробники можуть отримувати інформацію, таку як зрозуміле ім'я пристрої, підтримувані модулі і т. д.

У цьому навчальному посібнику показано класи Intel RealSense SDK, необхідні для ініціалізації та подальшого перерахування модулів і пристроїв.

Ініціалізація
Приклад ініціалізації основних обробників Intel RealSense SDK реалізований, щоб дати можливість створювати PXCSession в будь-який момент роботи програми.

int main(int argc, char *argv[])
try
{
PXCSession *pSession;
PXCSession::ImplDesc *pDesc;
PXCCapture *pCapture;
PXCSenseManager *pSenseManager;

// Initialize
pSession = PXCSession::CreateInstance();
pDesc = new PXCSession::ImplDesc();

pDesc->group = PXCSession::ImplGroup::IMPL_GROUP_SENSOR;
pDesc->subgroup = PXCSession::ImplSubgroup::IMPL_SUBGROUP_VIDEO_CAPTURE;

Перерахування
Перерахування модулів і пристроїв здійснюється шляхом послідовного перебору модулів PXCSession::ImplDesc та отримання зрозумілого зміни. Потім виконується перебір PXCCapture::DeviceInfo і опитування пристрою. Таким способом можна опитати модулі та можливості пристроїв для всіх камер, підключених до системи.

// Enumerate Devices
std::string temp;

// iterating over the present modules
for (int m = 0; ; m++)
{
PXCSession::ImplDesc desc2;
if (pSession->QueryImpl(pDesc, m, &desc2) < pxcStatus::PXC_STATUS_NO_ERROR)
{
break;
}
//temp = format("Module[%d]: %d", m, desc2.friendlyName);
wstring ws(desc2.friendlyName); string str(ws.begin(), ws.end());
std::cout << "Module[" << m << "]: " << str.c_str() << std::endl;

PXCCapture *pCap;
pSession->CreateImpl<PXCCapture>(&desc2, &pCap);

// interating over the devices
for (int d = 0; ; d++)
{
PXCCapture::DeviceInfo dinfo;
if (pCap->QueryDeviceInfo(d, &dinfo) < pxcStatus::PXC_STATUS_NO_ERROR)
{
break;
};
wstring ws(dinfo.name); string str(ws.begin(), ws.end());
std::cout << "Device[" << d << "]: " << str.c_str() << std::endl;

/*wstring ws(dinfo.orientation); string str(ws.begin(), ws.end());
std::cout << "Device[" << d << "]: " << str.c_str() << std::endl;

wstring ws(dinfo.model); string str(ws.begin(), ws.end());
std::cout << "Device[" << d << "]: " << str.c_str() << std::endl;*/

}
}

Зверніть увагу на зовнішній цикл, необхідний для послідовного перебору поточного модуля, і на внутрішній цикл, який служить для перебору підключених пристроїв.

Висновок
Перерахування камер — важливий етап у роботі будь-якого додатка, в якому може знадобитися вибрати певну камеру з декількох підключених до системи. У цьому навчальному посібнику представлена проста схема перерахування камер для розробників, бажаючих вбудувати в свій додаток необхідну логіку вибору після ідентифікації певної камери і її можливостей. Повний приклад використання наведено в додатку 1 до цього навчального посібника.

Ресурси
Додаток 1. Приклад вихідного коду
#include <windows.h>

#include < iostream>
#include < string>
#include <cstdio>
//
#include "pxcbase.h"
#include "pxcsensemanager.h"
#include "pxcmetadata.h"
#include "service/pxcsessionservice.h"

#include "pxccapture.h"
#include "pxccapturemanager.h"

using namespace std;

int main(int argc, char *argv[])
try
{
PXCSession *pSession;
PXCSession::ImplDesc *pDesc;
PXCCapture *pCapture;
PXCSenseManager *pSenseManager;

// Initialize
pSession = PXCSession::CreateInstance();
pDesc = new PXCSession::ImplDesc();

pDesc->group = PXCSession::ImplGroup::IMPL_GROUP_SENSOR;
pDesc->subgroup = PXCSession::ImplSubgroup::IMPL_SUBGROUP_VIDEO_CAPTURE;

// Enumerate Devices
std::string temp;

for (int m = 0; ; m++)
{
PXCSession::ImplDesc desc2;
if (pSession->QueryImpl(pDesc, m, &desc2) < pxcStatus::PXC_STATUS_NO_ERROR)
{
break;
}
//temp = format("Module[%d]: %d", m, desc2.friendlyName);
wstring ws(desc2.friendlyName); string str(ws.begin(), ws.end());
std::cout << "Module[" << m << "]: " << str.c_str() << std::endl;

PXCCapture *pCap;
pSession->CreateImpl<PXCCapture>(&desc2, &pCap);

// print out all device information
for (int d = 0; ; d++)
{
PXCCapture::DeviceInfo dinfo;
if (pCap->QueryDeviceInfo(d, &dinfo) < pxcStatus::PXC_STATUS_NO_ERROR)
{
break;
};
wstring ws(dinfo.name); string str(ws.begin(), ws.end());
std::cout << "Device[" << d << "]: " << str.c_str() << std::endl;

/*wstring ws(dinfo.orientation); string str(ws.begin(), ws.end());
std::cout << "Device[" << d << "]: " << str.c_str() << std::endl;

wstring ws(dinfo.model); string str(ws.begin(), ws.end());
std::cout << "Device[" << d << "]: " << str.c_str() << std::endl;*/

}
}


cin.clear();
cout << endl << "Press any key to continue...";
cin.ignore();

return 0;
}
catch (const char *c)
{
std::cerr << "Program aborted: " << << "\n";
MessageBox(GetActiveWindow(), (LPCWSTR)c, L"FAIL", 0);
}
catch (std::exception e)
{
std::cerr << "Program aborted: " << e.what() << "\n";
MessageBox(GetActiveWindow(), (LPCWSTR)e.what(), L"FAIL", 0);
}


Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.