本sdk是深度摄像头通用sdk,他有一种可加性架构用来添加任何的深度摄像头。目前,它支持下列的深度摄像机:
- Voxel-14
- Voxel-D
- OPT8140-CDK ("Haddock")
- OPT8241-CDK ("Tintin")咱们主要用这一款
这一节提供SDK的详细说明文档。本节同时为sdk用户给予解释和试例应用程序。
第一个试例:深度摄像头捕捉
在本例中,我们将用到cmake编译系统。请先完成上一节的预备工作,并下载本例。 https://github.com/3dtof/voxelsdk-examples/releases
- 首先,建立文件夹“DepthCapture”
· 现在,我们一起来定义一个cmake工程,用文本框建立文本文件CMakeLists.txt。
· 为了在你自己的应用程序内使用三维sdk,你需要让cmke找到它并且为它做好头文件和lib库的准备。为了达到这一目的,你需要在你的文本文档内加入以下代码:
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.11)
PROJECT(DepthCameraCapture)
FIND_PACKAGE(Voxel 0.1.0 REQUIRED)
· 三维使用了c++11(同c99一样是个规范)如果你用linux开发,gcc编译器需要你特别声明。
IF(CMAKE_SYSTEM_NAME STREQUAL"Linux")
ADD_DEFINITIONS(-std=c++11)
ENDIF()
· 现在,让我们为应用程序定义可执行文件:
ADD_EXECUTABLE(DepthCapture DepthCapture.cpp)
where DepthCapture.cpp is the actualapplication source code using the Voxel SDK.
这里的“DepthCapture.cpp”是实际的使用三维SDK的应用源码。
· Cmake 需要在DepthCapture可执行文件中使用三维SDK的头文件。所以,他还需要链接上三维SDKlib库。可以通过以下代码实现:
TARGET_INCLUDE_DIRECTORIES(DepthCapture PUBLIC ${VOXEL_INCLUDE_DIRS})
TARGET_LINK_LIBRARIES(DepthCapture ${VOXEL_LIBRARIES})
· 现在,让我们在编写DepthCapture.cpp的过程中使用三维SDK。先包括CameraSystem.h代码如下:
#include"CameraSystem.h"
usingnamespaceVoxel;
· 现在,在main()函数里。做以下的事情:
CameraSystem sys;
// Get all valid detected devices
const Vector<DevicePtr> &devices = sys.scan();
DevicePtr toConnect;
// Find out the device to connect
std::cout << "Detected devices: " << std::endl;
for(auto &d: devices)
{
std::cout << d->id() << std::endl;
if(d->interfaceID() == Device::USB)
{
USBDevice &usb = (USBDevice &)*d;
if(usb.vendorID() == vid && (serialNumber.size() == 0 || usb.serialNumber() ==serialNumber))
{
for(auto pid: pids)
if(usb.productID() == pid)
toConnect = d;
}
}
}
if(!toConnect)
{
std::cerr << "No valid device found for thespecified VID:PID:serialnumber" << std::endl;
return -1;
}
// Now we have a device to connect to. So, connect to itand get a DepthCamera
DepthCameraPtr depthCamera =sys.connect(toConnect);
// Check to see whether depth camera is instantiated andis initialized
if(!depthCamera)
{
std::cerr << "Could not load depth camera fordevice " <<toConnect->id() << std::endl;
return -1;
}
if(!depthCamera->isInitialized())
{
std::cerr << "Depth camera not initialized fordevice " <<toConnect->id() << std::endl;
return -1;
}
std::cout << "Successfully loaded depth camera fordevice " <<toConnect->id() << std::endl;
// Register required type of callback as follows
depthCamera->registerCallback(frametype, callbackfunction);
· 几种有效的帧类型(frametype)是:
DepthCamera::FRAME_RAW_FRAME_UNPROCESSED
DepthCamera::FRAME_RAW_FRAME_PROCESSED
DepthCamera::FRAME_DEPTH_FRAME
DepthCamera::FRAME_XYZI_POINT_CLOUD_FRAME
· 回调函数(callbackfunction)需要以下的参数:
voidcallbackfunction(DepthCamera &dc, const Frame &frame, DepthCamera::FrameTypec);
fram是要求一种基于回调类型(callback type)的帧类型,RawFrame, DepthFrame 或PointCloudFrame其中之一。如果回调类型是DepthCamera::FRAME_RAW_FRAME_PROCESSED,那么基于深度摄像头的类型,一种适当处理过的RawFrame如TOF摄像头对应的ToFRawFrame。
· 回调函数也可以被当作一种待定函数。
· 现在,所有的准备工作都做好好了,只需要开启捕获,做法如下:
depthCamera->start();
返回值是一个布尔值,用来表示捕获是否开启。
· 想要停止捕获,只需要
depthCamera->stop();
建立这个例子
现在,为了编译这个例子,需要在你的终端上做下面的事情。确保在你的文件夹CMakeLists.txt和DepthCapture.cpp已经存在。
mkdir build
cd build
cmake-gui .. ## Configure and generate requiredproject
现在,用如下代码编译你的示例
make # in Linux terminal
cmake --build . --target ALL_BUILD --config Release # in Windows terminal
Or, youcan open the generated Visual studio solution in case of Windows and compileand build it from there. In case of Linux, you can choose your favouritedevelopment environment - Eclipse, Code::Blocks, KDevelop4 and build it.
或者你也可以打开生成的vs解决方案,在windows平台下下编译和建立。如果用linux,你可以选自己喜欢的开发环境Eclipse,Code::Blocks, KDevelop4等来进行建立。
警告:注意所有库的debug和release版本,一定要对应。