Get first Orbbec device
ob::Context ctx;
auto devList = ctx.queryDeviceList();
auto dev = devList->getDevice(0);
Start Streaming with Default Configuration
ob::Pipeline pipe; // create pipe with default device
pipe.start(nullptr); // start with defualt configuratio
Start Streaming Infrared Imager
For TOF or Single-Camera structured light devices:
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);
For Dual-Camera structured light devices:
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);
Wait for Coherent Set of Frames
ob::Pipeline pipe;
pipe.start(nullptr);
auto frameSet = pipe.waitForFrames(100);
auto depthFrame = frameSet->depthFrame();
Do Processing on a Background-Thread
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)
}
}
Get Depth-to-Color Extrinsics
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);
Get Video Stream Intrinsics
From 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();
From Frame/StreamProfile (Gemini 300 series only):
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();
Get Depth Units
ob::Pipeline pipe;
pipe.start(nullptr);
auto frameSet = pipe.waitForFrames(100);
auto depthFrame = frameSet->depthFrame();
auto uint = depthFrame->getValueScale();
Controlling the Laser
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);