Учебное руководство: перечисление модулей и камер

в 6:54, , рубрики: Intel RealSense SDK, Блог компании Intel, Программирование, Разработка для интернета вещей

Перечисление функциональных модулей и нескольких камер — важный компонент логики приложения для выбора нужного устройства. В этом учебном руководстве описывается метод перечисления модулей и нескольких устройств, чтобы можно было выбрать нужное из них.

Учебное руководство: перечисление модулей и камер - 1



Обнаружение камер, подключенных к системе, и определение возможностей этих камер можно упростить с помощью перечисления устройств. В 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: " << c << "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);
}

Автор: Intel

Источник

Поделиться новостью

* - обязательные к заполнению поля