Generate executable samples To run the code samples, use CMake Tool to generate executable samples of Vidu SDK::
>>> #under ViduSdk
>>> mkdir build && cd build
>>> cmake ../
>>> make -j
>>> ./example/streamShow
Get Camera Parameters
#include "basic/inc/camParaDef.h"
#include "debug.h"
#include "inc/PDdevice.h"
#include "inc/PDstream.h"
#include "stringFormat.h"
int main()
{
PDdevice devInst;
intrinsics intrin;
extrinsics extrin;
if (devInst.init())
{
size_t streamNum = devInst.getStreamNum();
for (int i = 0; i < streamNum; i++)
{
PDstream streamInst(devInst, i);
streamInst.init();
PD_INFO("stream : %s\n", streamInst.getStreamName().c_str());
if (streamInst.getCamPara(intrin, extrin))
{
print_intrinsics(&intrin);
print_extrinsics(&extrin);
}
}
return system("pause");
}
return 0;
}
GenICam Transport Layer Client Interface.
We first initialize a PDdevice
object named as devInst
, and retrieve its streamNum
through the member function PDdevice::getStreamNum()
. Then we use the devInst
and stream index starting from 0 to streamNum - 1
, to instantiate the stream class PDstream
's object streamInst
. Each stream physically corresponds to an RGB or ToF pipeline that has its optics, sensors and ISPs. As a result, each stream has its intrinsics and extrinsics. We call the PDstream
class's member function PDstream::getCamPara
to retrieve the intrinsics and extrinsics. Finally, we print them with the wrapped function print_intrinsics
and print_extrinsics
correspondingly.
RGB Streaming Demo
Below lists the code to grab and show the RGB image captured by the Okulo P1 camera.
#include "inc/PDdevice.h"
#include "inc/PDstream.h"
#include "stringFormat.h"
#include "timeTest.h"
#include <chrono>
#include <thread>
int rgbDemo()
{
PDdevice devInst;
if (devInst)
{
auto stream = PDstream(devInst, "RGB");
if (stream)
{
bool isAutoExposure = false;
stream.get("AutoExposure", isAutoExposure);
if (isAutoExposure)
{
stream.set("AutoExposure", false);
}
stream.set("Exposure", 1.0f);
stream.set("Gain", 1.0f);
while (1)
{
auto frame = stream.waitFrames();
char key = cv::waitKey(1);
if (frame)
{
const cv::Mat &rgb = frame->getMat(0);
cv::imshow("rgb", rgb);
if (key == 'c')
{
printf("saved \n");
}
}
if (key == 'q')
{
break;
}
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
return true;
}
}
return false;
}
GC_API PDBufferSave(BUFFER_HANDLE hBuffer, const char *filesName, int opt)
Write the buffer to disk.
We instantiate the rgb stream with PDdevice devInst
and the string name RGB
. Once the stream
object is successfully created (not a null pointer), we set the exposure mode, exposure time and ADC gain through stream.set()
function. Then, we unterminatedly invoke stream.waitFrames()
to refresh the current frame and use cv::imshow()
to draw it in a window. Furthermore, with the "rgb" window selected, once clicking the keyboard's c
key, we will save an RGB frame to disk.
Pointcloud Streaming Demo
#include "inc/PDdevice.h"
#include "inc/PDstream.h"
#include "stringFormat.h"
#include "timeTest.h"
#include <chrono>
#include <thread>
int pclDemo()
{
PDdevice devInst;
if (devInst)
{
auto pclstream = PDstream(devInst, "PCL");
if (pclstream)
{
bool isTofAutoExposure = false;
bool isRGBAutoExposure = false;
pclstream.get("ToF::AutoExposure", isTofAutoExposure);
pclstream.get("RGB::AutoExposure", isRGBAutoExposure);
if (isTofAutoExposure)
{
pclstream.set("ToF::AutoExposure", false);
}
if (isRGBAutoExposure)
{
pclstream.set("RGB::AutoExposure", false);
}
pclstream.set("ToF::Distance", 7.5f);
pclstream.set("ToF::StreamFps", 50.0f);
pclstream.set("ToF::Threshold", 100);
pclstream.set("ToF::Exposure", 1.0f);
pclstream.set("RGB::Exposure", 10.0f);
pclstream.set("RGB::Gain", 20.0f);
bool saveReq = false;
int count = 0;
float DistRange = 0.0f;
while (1)
{
auto pPclFrame = pclstream.waitFrames();
char key = cv::waitKey(1);
if (key == 'c')
{
saveReq = true;
}
if (key == 'q')
{
break;
}
if (pPclFrame)
{
if (DistRange < 1e-5)
{
size_t varSize = sizeof(varSize);
"Range", &DistRange,
&varSize, nullptr);
printf("max distance %f for distanceMap\n", DistRange);
}
const cv::Mat &xyz = pPclFrame->getMat(0);
const cv::Mat &infrared = pPclFrame->getMat(1);
const cv::Mat &color = pPclFrame->getMat(2);
std::vector<cv::Mat> channels(3);
cv::split(xyz, channels);
const cv::Mat &depth = channels[2];
cv::Mat u16Depth;
depth.convertTo(u16Depth, CV_16UC1, 65535.0 / DistRange);
cv::imshow("xyz", xyz);
cv::imshow("infrared", infrared);
cv::imshow("color", color);
cv::imshow("depth", depth);
if (saveReq)
{
saveReq = false;
cv::imwrite(stringFormat("depth-%d.png", count), u16Depth);
printf("saved \n");
count++;
}
}
pPclFrame.reset();
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
return true;
}
}
return false;
}
GC_API PDBufferGetMetaByName(BUFFER_HANDLE hBuffer, const char *varName, INFO_DATATYPE *piType, void *pBuffer, size_t *piSize)
Get stream metadata information of the buffer.
We show the code for the streaming of Point-Cloud, in this application, we need to use both RGB and ToF streams to support color mapping to 3D space. We directly, instantiate the pclstream
with PDstream(devInst, "PCL")
, and the PCL
string name will be recognized.