相机应用代码开发基础

    PG电子


      PG电子

      相机应用代码开发基础

      API 如何使用

      获取第一个 Orbbec 设备

      ob::Context ctx;
      auto devList = ctx.queryDeviceList();
      auto dev = devList->getDevice(0);

      通过默认配置开启数据流

      ob::Pipeline pipe;  // create pipe with default device
      pipe.start(nullptr);  // start with defualt configuratio

      开启红外数据流

      对于 TOF 或单目结构体光设备:

      ob::Pipeline pipe;
      std::shared_ptr<ob::Config> config = std::make_shared<ob::Config>();
      auto irProfiles = pipe.getStreamProfileList(OB_SENSOR_IR);
      auto irProfile = irProfiles->getProfile(OB_PROFILE_DEFAULT);
      config->enableStream(irProfile);
      pipe.start(config);

       

      对于双目结构光设备:

      ob::Pipeline pipe;
      std::shared_ptr<ob::Config> config = std::make_shared<ob::Config>();

      auto irLeftProfiles = pipe.getStreamProfileList(OB_SENSOR_IR_LEFT);
      auto irLeftProfile = irLeftProfiles->getProfile(OB_PROFILE_DEFAULT);
      config->enableStream(irLeftProfile);

      auto irRightProfiles = pipe.getStreamProfileList(OB_SENSOR_IR_RIGHT);
      auto irRightProfile = irRightProfiles->getProfile(OB_PROFILE_DEFAULT);
      config->enableStream(irRightProfile);

      pipe.start(config);

      等待获取一组数据帧

      ob::Pipeline pipe;
      pipe.start(nullptr);
      auto frameSet = pipe.waitForFrames(100);
      auto depthFrame = frameSet->depthFrame();

      在后台子线程处理数据

      std::mutex frameQueueMtx;
      std::queue<std::shared_ptr<ob::Frame>> frameQueue;
      auto precessThread = std::thread([&](){
          std::shared_ptr<ob::Frame> depthFrame;
          while(true{
            {
              std::lock_guard<std::mutex> lk(frameQueueMtx);
              if(frameQueue.empty()){
                std::this_thread::sleep_for(std::chrono::milliseconds(10));
                continue;
              }
              depthFrame = frameQueue.front();
              frameQueue.pop();
            }
            auto depthFrameData = depthFrame->data();
            // do some thing to process depth frame data;
          }
      })


      ob::Pipeline pipe;
      pipe.start(nullptr);
      while(true){
        auto frameSet = pipe.waitForFrames(100);
        auto depthFrame = frameSet->depthFrame();

        if(depthFrame){
          std::lock_guard<std::mutex> lk(frameQueueMtx);
          frameQueue.push(depthFrame)
        }
      }

      获取深度到 RGB 的外参


      ob::Pipeline pipe;
      auto depthProfiles = pipe.getStreamProfileList(OB_SENSOR_DEPTH);
      auto depthProfile = depthProfiles->getProfile(OB_PROFILE_DEFAULT);
      auto colorProfiles = pipe.getStreamProfileList(OB_SENSOR_DEPTH);
      auto colorProfile = depthProfiles->getProfile(OB_PROFILE_DEFAULT);

      auto extrinsics = depthProfile->getExtrinsicTo(colorProfile);

      获取视频流内参

      通过 Pipeline 获取:

      ob::Pipeline pipe;
      pipe.start(nullptr);
      // get camera intrinsic and extrinsic parameters form pipeline and set to point cloud filter
      auto cameraParam = pipeline.getCameraParam();

       

      通过 Frame/StreamProfile 获取(仅支持 Gemini 300 series):

      ob::Pipeline pipe;
      pipe.start(nullptr);

      auto frameSet = pipe.waitForFrames(100);
      auto frame = frameSet->depthFrame();
      auto streamProfile = frame->getStreamProfile();
      auto videoStreamProfile = streamProfile->as<ob::VideoStreamProfile>();

      auto intrinsic = videoStreamProfile->getIntrinsic();

      获取深度单位

      ob::Pipeline pipe;
      pipe.start(nullptr);

      auto frameSet = pipe.waitForFrames(100);
      auto depthFrame = frameSet->depthFrame();

      auto uint = depthFrame->getValueScale();

      控制激光

      ob::Pipeline pipe;
      auto dev = pipe->getDevice();

      // Laser control (for Gemini 300 series)
      dev->setIntProperty(OB_PROP_LASER_CONTROL_INT, 1); // 0: off, 1: on, 2: auto

      // Turn on/off laser (for other series)
      dev->setBoolProperty(OB_PROP_LASER_BOOL, true);

      // Laser energy level control
      dev->setIntProperty(OB_PROP_LASER_ENERGY_LEVEL_INT, 2);

       


      友情链接: