API 详解 (C++)
GetVersionString 获取 VCameraSDK 版本
// 代码开头需要引用头文件
#include "vcamera/version.h"
// 打印 VCameraSDK 版本
std::cout << "GetVersionString:" << GetVersionString() << std::endl;
CameraUtils 类
CameraUtils 是 SDK 提供的一个静态工具类,专门用于相机设备的发现、网络配置、SDK和相机日志配置。
Init 初始化 SDK
初始化相机通信底层库。
CameraUtils::Init(true);
重要
直连模式(默认,推荐):调用
Init(true)。普通用户使用此模式即可,一台摄像头只能被一个进程连接。RPC 模式(高级):调用
Init(false),支持多进程连接。不推荐普通用户使用,仅在需要多进程时采用。使用此模式需将rpc/文件夹中的文件复制到程序目录。
DiscoverCameras 发现相机设备
扫描当前可用的相机设备,返回 CameraInfo 列表(包含 MAC 地址、当前 IP 等信息)。
CameraUtils::Init(true);
auto devicelist = CameraUtils::DiscoverCameras();
for (auto& device : devicelist) {
std::cout << "======Device Information======" << std::endl;
std::cout << " " << "serial_number : " << device.serial_number << std::endl;
std::cout << " " << "status : " << (int)device.state << std::endl;
std::cout << " " << "model : " << device.model << std::endl;
std::cout << " " << "vendor : " << device.vendor << std::endl;
std::cout << " " << "name : " << device.name << std::endl;
std::cout << " " << "firmware_version : " << device.firmware_version << std::endl;
std::cout << " " << "network_info.mac : " << device.network_info.mac << std::endl;
std::cout << " " << "network_info.ip : " << device.network_info.ip << std::endl;
std::cout << " " << "network_info.netmask : " << device.network_info.netmask << std::endl;
std::cout << " " << "network_info.gateway : " << device.network_info.gateway << std::endl;
std::cout << " " << "network_info.broadcast : " << device.network_info.broadcast << std::endl;
std::cout << "Interface Information" << std::endl;
std::cout << " " << "interface_info.id : " << device.interface_info.id << std::endl;
std::cout << " " << "interface_type : " << (int)device.interface_info.interface_type << std::endl;
std::cout << " " << "interface_info.name : " << device.interface_info.name << std::endl;
std::cout << " " << "interface_info.network_info.broadcast : " << device.interface_info.network_info.broadcast << std::endl;
std::cout << " " << "interface_info.network_info.gateway : " << device.interface_info.network_info.gateway << std::endl;
std::cout << " " << "interface_info.network_info.ip : " << device.interface_info.network_info.ip << std::endl;
std::cout << " " << "interface_info.network_info.mac : " << device.interface_info.network_info.mac << std::endl;
std::cout << " " << "interface_info.network_info.netmask : " << device.interface_info.network_info.netmask << std::endl;
std::cout << " " << "usb_info.address : " << device.usb_info.address << std::endl;
std::cout << " " << "usb_info.bus : " << device.usb_info.bus << std::endl;
}
SetIpAddress 设置静态 IP
该接口用于设置相机的静态 ip。该接口有 2 种使用方法。
第一种,传入相机的 mac 地址,以及需要设置的 ip、netmask、gateway。
CameraUtils::Init(true);
auto devicelist = CameraUtils::DiscoverCameras();
CameraApiStatus ret = CameraUtils::SetIpAddress("06:20:FD:B6:D4:95","192.168.6.85","255.255.255.0","192.168.6.1");
if (ret.IsSuccess()) {
printf("Set camera static ip success!\n");
}
else {
printf("Set camera static ip failed : %s\n", ret.message().c_str());
}
第二种,传入相机的 CamInfo,以及需要设置的 ip、netmask、gateway。
CameraUtils::Init(true);
auto devicelist = CameraUtils::DiscoverCameras();
for (auto& device : devicelist) {
if (device.network_info.mac == "06:20:FD:B6:D4:95" && device.interface_info.id == "eth-88-a4-c2-b1-35-e37f06a8c0") {
CameraApiStatus ret = CameraUtils::SetIpAddress(device, "192.168.6.88", "255.255.255.0", "192.168.6.1");
if (ret.IsSuccess()) {
printf("Set camera static ip success!\n");
}
else {
printf("Set camera static ip failed : %s\n", ret.message().c_str());
}
}
}
SetIpToDynamic 设置动态 IP
该接口用于设置相机的动态 ip。该接口有2种使用方法。
第一种,传入相机的 mac 地址。
CameraUtils::Init(true);
auto devicelist = CameraUtils::DiscoverCameras();
CameraApiStatus ret = CameraUtils:: SetIpToDynamic ("06:20:FD:B6:D4:95");
if (ret.IsSuccess()) {
printf("Set camera Dynamic ip success!\n");
}
else {
printf("Set camera Dynamic ip failed : %s\n", ret.message().c_str());
}
第二种,传入相机的 CamInfo。
CameraUtils::Init(true);
auto devicelist = CameraUtils::DiscoverCameras();
for (auto& device : devicelist) {
if (device.network_info.mac == "06:20:FD:B6:D4:95" && device.interface_info.id == "eth-88-a4-c2-b1-35-e37f06a8c0") {
CameraApiStatus ret = CameraUtils::SetIpToDynamic(device);
if (ret.IsSuccess()) {
printf("Set camera static ip success!\n");
}
else {
printf("Set camera static ip failed : %s\n", ret.message().c_str());
}
}
}
CameraFactory 类
CameraFactory 专用于实例化并连接不同配置的相机设备。提供三种静态工厂方法,支持通过序列号、IP 地址或预配置信息创建相机实例。
GetCameraBySerialNumber 通过序列号获取相机
该接口用于通过相机序列号来创建相机实例。
Camera camera = CameraFactory::GetCameraBySerialNumber("207000159118");
GetCameraByIpAddress 通过 IP 获取相机
该接口用于通过相机 ip 地址来创建相机实例。
Camera camera = CameraFactory::GetCameraByIpAddress("192.168.6.58");
GetCameraByCameraInfo 通过相机信息获取相机
该接口用于通过相机的信息来创建相机实例。
Camera camera;
auto devicelist = CameraUtils::DiscoverCameras();
for (auto& list : devicelist) {
if(list.serial_number == "207000162237")
camera = CameraFactory::GetCameraByCameraInfo(list);
}
Camera 类
核心设备控制与图像采集接口。
注解
Camera 对象使用流程:
创建 Camera 对象 → Connect() → 其他操作 → Disconnect()
GetCameraInfo 获取相机信息
用于获取相机设备的信息。
CameraInfo information;
CameraApiStatus ret = camera.GetCameraInfo(information);
if (ret.IsSuccess()) {
printf("\033[91mGetCameraInfo success\033[0m\n");
std::cout << "Device Information" << std::endl;
std::cout << " " << "serial_number : " << information.serial_number << std::endl;
std::cout << " " << "status : " << (int)information.state << std::endl;
std::cout << " " << "model : " << information.model << std::endl;
std::cout << " " << "vendor : " << information.vendor << std::endl;
std::cout << " " << "name : " << information.name << std::endl;
std::cout << " " << "firmware_version : " << information.firmware_version << std::endl;
std::cout << " " << "network_info.mac : " << information.network_info.mac << std::endl;
std::cout << " " << "network_info.ip : " << information.network_info.ip << std::endl;
std::cout << " " << "network_info.netmask : " << information.network_info.netmask << std::endl;
std::cout << " " << "network_info.gateway : " << information.network_info.gateway << std::endl;
std::cout << " " << "network_info.broadcast : " << information.network_info.broadcast << std::endl;
std::cout << "Interface Information" << std::endl;
std::cout << " " << "interface_info.id : " << information.interface_info.id << std::endl;
std::cout << " " << "interface_type : " << (int)information.interface_info.interface_type << std::endl;
std::cout << " " << "interface_info.name : " << information.interface_info.name << std::endl;
std::cout << " " << "interface_info.network_info.broadcast : " << information.interface_info.network_info.broadcast << std::endl;
std::cout << " " << "interface_info.network_info.gateway : " << information.interface_info.network_info.gateway << std::endl;
std::cout << " " << "interface_info.network_info.ip : " << information.interface_info.network_info.ip << std::endl;
std::cout << " " << "interface_info.network_info.mac : " << information.interface_info.network_info.mac << std::endl;
std::cout << " " << "interface_info.network_info.netmask : " << information.interface_info.network_info.netmask << std::endl;
std::cout << " " << "usb_info.address : " << information.usb_info.address << std::endl;
std::cout << " " << "usb_info.bus : " << information.usb_info.bus << std::endl;
}
Connect 连接设备
用于连接设备。
camera.Connect();
Disconnect 断连设备
用于断连设备。
camera.Disconnect();
GetCameraState 获取相机状态
相机成功连接后获取当前相机状态。
CameraState camerastate;
CameraApiStatus ret = camera.GetCameraState(camerastate);
if (ret.IsSuccess()) {
printf("\033[96mCameraState %d\033[0m\n", camerastate);
}
else {
printf("\033[91mGetCameraState failed :%s\033[0m\n", ret.message().c_str());
}
StartCapture 开始采集图像
用于控制相机开始采集图像。
camera.StartCapture();
StopCapture 停止采集图像
用于控制相机停止采集图像。
camera.StopCapture();
GetFeature 获取待设置的参数
用于获取待设置的参数。
重要
SDK 支持设置的属性列表见 VcameraSDK-X.X.X/doc/feature_list/。
Feature feature;
CameraApiStatus ret = camera.GetFeature("AcquisitionMode", feature);
if (!ret.IsSuccess()) {
printf("\033[91mGetFeature failed :%s\033[0m\n", ret.message().c_str());
}
GetAllFeatures 获取所有参数
用于获取相机支持的所有参数。
std::vector<vcamera::Feature> features;
status = camera.GetAllFeatures(features);
具体使用方法请参见示例程序 VcameraSDK-X.X.X/cpp/example/DumpAllFeatures.cpp。
FireSoftwareTrigger 发送软触发采图信号
用于为工作在软触发模式下的相机发送软触发采图信号。
CameraApiStatus status = camera.FireSoftwareTrigger();
std::cout << "FireSoftwareTrigger status= " << status.message() << std::endl;
GetImageModes 获取图像格式和分辨率
用于获取指定传感器支持设置的图像格式和分辨率。
std::vector<ImageMode> image_mode;
CameraApiStatus ret = camera.GetImageModes(SensorType::Depth, image_mode);
if (!ret.IsSuccess()) {
printf("\033[91mGetImageModes failed :%s\033[0m\n", ret.message().c_str());
}
else {
for (auto& mode : image_mode) {
printf("ImageModePixelFormat : %d , ImageModeWidth :%d ,ImageModeHeight :%d\n ", mode.pixel_format , mode.width, mode.height);
}
}
GetCurrentImageMode 获取当前的图像格式和分辨率
用于获取指定传感器当前的图像格式和分辨率。
ImageMode image_mode;
camera.GetCurrentImageMode(SensorType::Depth, image_mode);
printf("CurrentImageModePixelFormat : %d , ImageModeWidth :%d ,ImageModeHeight :%d\n ", image_mode.pixel_format , image_mode.width, image_mode.height);
SetImageMode 设置图像格式和分辨率
用于设置指定传感器的图像格式和分辨率。
ImageMode image_mode;
image_mode.pixel_format = RawPixelFormat::Coord3D_C16;
image_mode.width = 320;
image_mode.height = 240;
CameraApiStatus ret = camera.SetImageMode(SensorType::Depth, image_mode);
printf("\033[91mSetImageMode1 :%s\033[0m\n", ret.message().c_str());
HasSensor 查询相机是否具有指定传感器
用于判断相机是否拥有指定的传感器。
bool has_sensor;
CameraApiStatus ret = camera.HasSensor(SensorType::Right, has_sensor);
if (!ret.IsSuccess()) {
printf("\033[91mHasSensor Call failed :%s\033[0m\n", ret.message().c_str());
}
else {
printf("HasSensor : %s\n", has_sensor ? "true" : "false");
}
IsSensorEnabled 获取传感器使能状态
用于判断相机指定的传感器是否被使能。
bool is_enable;
ret = camera.IsSensorEnabled(SensorType::Texture, is_enable);
if (!ret.IsSuccess()) {
printf("\033[91mIsSensorEnabledCallfailed:%s\033[0m\n", ret.message().c_str());
}
else {
printf("IsSensorEnabled:%s\n", is_enable ? "true" : "false");
}
SetSensorEnabled 设置传感器使能状态
用于使能或去使能指定的传感器输出图像。
CameraApiStatus ret = camera.SetSensorEnabled(SensorType::Left, true);
if (!ret.IsSuccess()) {
printf("\033[91mSetSensorEnabled Call failed :%s\033[0m\n", ret.message().c_str());
}
SetUndistortionEnabled 启用或禁用畸变矫正
用于对指定的传感器图像进行畸变校正或去畸变校正。
CameraApiStatus ret = camera.SetUndistortionEnabled(SensorType::Left, true);
printf("\033[91mSetUndistortionEnabled:%s\033[0m\n", ret.message().c_str());
IsMapDepthToTextureEnabled 获取深度对齐彩色使能状态
用于查询深度图到彩色图映射(深度与彩色对齐)是否启用。
bool isEnabled = false;
status = camera.IsMapDepthToTextureEnabled(isEnabled);
if (!status.IsSuccess()) {
std::cout << "Failed to check depth-to-color mapping status: " << status.message() << std::endl;
return -1;
}
std::cout << "Current depth-to-color mapping status: " << (isEnabled ? "Enabled" : "Disabled") << std::endl;
SetMapDepthToTextureEnabled 启用或禁用深度对齐彩色
启用或禁用深度图到彩色图的映射(深度图与彩色图对齐)。
status = camera.SetMapDepthToTextureEnabled(true);
if (!status.IsSuccess()) {
std::cout << "enable MapDepthToTexture err " << status.message() << std::endl;
return -1;
}
具体使用方法请参见示例程序 VcameraSDK-X.X.X/cpp/example/DepthToTextureRegistration.cpp。
SaveFeaturesToFile/LoadFeaturesFromFile 保存相机配置到文件/从文件加载配置
分别用于将相机配置保存到 JSON 文件,以及从 JSON 文件加载配置并应用到相机。
注解
不同相机类型的保存行为:
Gige_2_0 相机:仅保存相机连接后修改的参数。连接前已保存的参数不会被记录。
Gige_2_1 相机:会尽可能保存全部参数。具体保存的参数列表请参考安装路径下的
doc/feature_save_gige2_1.txt。
保存配置到文件:
std::string file_path_save = u8"D:/tmp/1.json";
status = camera.SaveFeaturesToFile(file_path_save);
从文件加载配置:
std::string file_path_load = u8"D:/tmp/1.json";
std::string error_message;
status = camera.LoadFeaturesFromFile(file_path_load, error_message);
具体使用方法请参见示例程序:
VcameraSDK-X.X.X/cpp/example/SaveFeaturesToFile.cppVcameraSDK-X.X.X/cpp/example/LoadFeaturesFromFile.cpp
SaveFeaturesToStorage/LoadFeaturesFromStorage 保存配置到相机内部存储区/从相机内部存储区加载配置
分别用于将相机配置保存到内部存储区,以及从内部存储区加载配置。
注解
该接口仅适用于 Gige_2_0 相机 。
对于 Gige_2_1 相机,请使用 UserSetManager 类 接口。
保存配置到内部存储区:
bool save_to_storage = true;
if (save_to_storage) {
status = camera.SaveFeaturesToStorage();
}
从内部存储区加载配置:
status = camera.StopCapture();
std::string error_message;
status = camera.LoadFeaturesFromStorage(error_message);
具体使用方法请参见示例程序:
VcameraSDK-X.X.X/cpp/example/SaveFeaturesToStorage.cppVcameraSDK-X.X.X/cpp/example/LoadFeaturesFromStorage.cpp
RegisterFrameSetCallback 图像回调函数
图像回调函数。
camera.RegisterFrameSetCallback([](const FrameSet& frameset){
cout << "FrameSetCallback" << endl;
Image image = frameset.GetImage(SensorType::Depth);
if(image.IsValid()){
cout << "Image: width:" << image.width() << " " << "height:" << image.height() << endl;
cout << "Image: frame index:" << image.frame_index() << endl;
cout << "Image: timestamp:" << image.time_stamp() << endl;
cout << "Image: sensor:" << image.sensor() << endl;
cout << "Image: sensor type:" <<(int)image.pixel_format() << endl;
cout << "Image: scale_unit:" << image.scale_unit() << endl;
cout << "Image: distortion:";for(float f : image.calib_info().distortion.data) cout << f << " "; cout << endl;
cout << "Image: intrinsic:";for(float f : image.calib_info().intrinsic.data) cout << f << " "; cout << endl;
cout << "Image: extrinsic:";for(float f : image.calib_info().extrinsic.data) cout << f << " "; cout << endl;
}
});
RegisterCameraEventCallback 相机事件回调函数
相机事件回调函数。
camera.RegisterCameraEventCallback(
[](CameraEventCode event_code, int error_code) {
switch (event_code) {
case CameraEventCode::Offlined:
printf("\033[93mWaiting for reconnecting ... ...\033[0m\n");
break;
case CameraEventCode::Started:
printf("\033[93mCamera Started ... ...\033[0m\n");
break;
case CameraEventCode::Opened:
printf("\033[93mCamera Opened ... ...\033[0m\n");
break;
case CameraEventCode::Stopped:
printf("\033[93mCamera Stopped ... ...\033[0m\n");
break;
case CameraEventCode::Closed:
printf("\033[93mCamera Closed ... ...\033[0m\n");
break;
case CameraEventCode::Error:
printf("\033[93mCamera Error ... ...\033[0m\n");
break;
}
}
);
UserSetManager 类
GetAllUserSets 获取所有用户设置
用于获取相机的所有用户设置(UserSet)。
vector<UserSet> usersetall;
UserSetManager& usersetmanager = camera.GetUserSetManager();
CameraApiStatus ret = usersetmanager.GetAllUserSets(usersetall);
for (auto usersets : usersetall) {
std::cout << usersets.sid << " " << usersets.name << std::endl;
}
其中,
sid:唯一编号,不可更改,内容为 Default0-7,UserSet0-7。
name: 名称
SaveToUserSet 保存到用户设置
用于保存用户设置(UserSet),该接口有 2 种使用方式。
第一种:使用 UserSet 名称保存
vector<UserSet> usersetall;
UserSetManager& usersetmanager = camera.GetUserSetManager();
CameraApiStatus ret = usersetmanager.GetAllUserSets(usersetall);
ret = usersetmanager.SaveToUserSet("123");
if (ret.IsSuccess()) {
printf("\033[92mSaveToUserSet success\033[0m\n");
}
第二种:使用 UserSet 对象保存
vector<UserSet> usersetall;
UserSetManager& usersetmanager = camera.GetUserSetManager();
CameraApiStatus ret = usersetmanager.GetAllUserSets(usersetall);
if (ret.IsSuccess()) {
for (auto usersets : usersetall) {
std::cout << usersets.name << " " << usersets.sid << std::endl;
if (usersets.name == "789") {
ret = usersetmanager.SaveToUserSet(usersets);
if(ret.IsSuccess()){
printf("\033[92mSaveToUserSet %s(sid: %s) success\033[0m\n", usersets.name.c_str(), usersets.sid.c_str());
}
}
}
}
SaveToUserSetWithNewName 重命名用户设置并保存
该接口用于重命名用户设置(UserSet)并执行保存动作。传入的第一个参数为旧名称,第二个参数为新名称。
vector<UserSet> usersetall;
UserSetManager& usersetmanager = camera.GetUserSetManager();
CameraApiStatus ret = usersetmanager.GetAllUserSets(usersetall);
ret = usersetmanager.SaveToUserSetWithNewName("123","Peace");
if (ret.IsSuccess()) {
printf("\033[92mSaveToUserSetWithNewName success\033[0m\n");
}
else {
printf("\033[91mSaveToUserSetWithNewName failed : %s\033[0m\n", ret.message().c_str());
}
LoadUserSet 加载用户设置
该接口用于加载所需的用户设置(UserSet),调用时传入需要加载的 UserSet 名称即可,代码如下:
vector<UserSet> usersetall;
UserSetManager& usersetmanager = camera.GetUserSetManager();
CameraApiStatus ret = usersetmanager.GetAllUserSets(usersetall);
ret = usersetmanager.LoadUserSet("standard_ObstacleAvoidance");
if (ret.IsSuccess()) {
printf("\033[92mLoadUserSet success\033[0m\n");
}
else {
printf("\033[91mLoadUserSet failed : %s\033[0m\n", ret.message().c_str());
}
CurrentUserSet 读取当前用户设置
该接口用于读取当前使用的用户设置(UserSet)名称。
vector<UserSet> usersetall;
UserSetManager& usersetmanager = camera.GetUserSetManager();
CameraApiStatus ret = usersetmanager.GetAllUserSets(usersetall);
std::string CurrentUserSetName;
ret = usersetmanager.CurrentUserSet(CurrentUserSetName);
if (ret.IsSuccess()) {
printf("\033[95mCurrentUserSet : %s\033[0m\n", CurrentUserSetName.c_str());
}
GetPowerOnUserSet 读取相机上电时的用户设置
该接口用于读取相机上电时的默认用户设置(UserSet)的名称。
vector<UserSet> usersetall;
UserSetManager& usersetmanager = camera.GetUserSetManager();
CameraApiStatus ret = usersetmanager.GetAllUserSets(usersetall);
std::string PowerOnUserSetName;
ret = usersetmanager.GetPowerOnUserSet(PowerOnUserSetName);
if (ret.IsSuccess()) {
printf("\033[95mPowerOnUserSet : %s\033[0m\n", PowerOnUserSetName.c_str());
}
SetPowerOnUserSet 设置相机上电时的用户设置
该接口用于设置相机上电时的用户设置(UserSet)。调用时传入UserSet的名称即可。
vector<UserSet> usersetall;
UserSetManager& usersetmanager = camera.GetUserSetManager();
CameraApiStatus ret = usersetmanager.GetAllUserSets(usersetall);
ret = usersetmanager.SetPowerOnUserSet("HelloWorld");
if (ret.IsSuccess()) {
printf("\033[92mSetPowerOnUserSet success\033[0m\n");
}
else {
printf("\033[91mSetPowerOnUserSet failed : %s\033[0m\n",ret.message().c_str());
}
ImageProc 类
DepthImageToPointCloud 将深度图转换为点云
该接口将输入的深度图转换为点云数据。
CameraApiStatus status;
PointCloud point_cloud = ImageProc::DepthImageToPointCloud(image, &status);
// Among them, invalid points are represented by "nan".
std::vector<PointXYZ> points = pcOut.GetPoints();
具体使用方法请参见示例程序 VcameraSDK-X.X.X/cpp/example/DepthImageToPointCloud.cpp。
PointCloudToDepthImage 将点云转换为深度图
参数:点云、深度内参、目标宽度、目标高度、深度缩放系数(可选,默认1)
返回值:深度图
TransformPointCloud 将点云转换到另一个坐标系下
参数:点云、外参矩阵、是否使用逆变换(可选,默认 false)
返回值:转换后的点云对象
MapTextureImageToDepth 将彩色图对齐到深度图
参数:彩色图(允许带畸变)、目标深度图(用于获取尺寸和标定参数)
返回值:与深度图尺寸相同的对齐后彩色图
MapGrayImageToDepth 将灰度图对齐到深度图
参数:灰度图(GRAY8 或 GRAY16,允许带畸变)、目标深度图(用于获取尺寸和标定参数)
返回值:与深度图尺寸相同的对齐后灰度图
MapDepthImageToTexture 将深度图对齐到彩色图
参数:深度图(DEPTH16,允许带畸变)、彩色图(用于获取尺寸和标定参数)
返回值:与纹理图尺寸相同的对齐后深度图
UndistortImage 对图像进行去畸变处理
参数:图像(GRAY8 / GRAY16 / RGB24 / DEPTH16)、新内参(可选,默认与输入相同)
返回值:去畸变后的图像
CameraApiStatusCode(API状态码)
Success,
Failure,
ArrayInfoInvalid,
ArrayInvalid,
CalibrationInfoInvalid,
CameraInvalid,
ComponentInvalid,
DeviceInvalid,
DeviceError,
DeviceIdle,
DeviceBusy,
DeviceLost,
DeviceInterfaceInvalid,
DeviceInterfaceTypeError,
DeviceInfoInvalid,
FeatureInvalid,
FeatureInfoInvalid,
FeatureTypeError,
FrameInvalid,
FrameMetadataInvalid,
FrameBufferInvalid,
FrameBufferConsumerInvalid,
FrameSetInvalid,
FrameSetStreamInvalid,
FrameSetConsumerInvalid,
TriggerModeError,
NotExist,
NotImplemented,
NotPermitted,
NotSupported,
OutOfMemory,
OutOfIndexRange,
OutOfValueRange,
ParameterInvalid,
StructureInfoInvalid,
StructureInvalid,
Timeout,
ValueInvalid,
ValueTypeError,
ValueInfoInvalid,
NullCameraHandle,
UserSetIsFull,
设置/读取相机属性
IsValid 检查属性是否有效
判断该相机是否支持该属性。
Feature feature;
CameraApiStatus ret = camera.GetFeature("DepthRangeMax", feature);
bool isValid = ret.IsSuccess();
if (isValid) {
printf("\033[92m Feature is valid \033[0m\n");
}
else {
printf("\033[91m Error: %s (code: %d)\033[0m\n", ret.message().c_str(), (int)ret.code());
}
GetName 获取属性名称
Feature feature;
CameraApiStatus ret = camera.GetFeature("LightController0/LightBrightness", feature);
if (ret.IsSuccess()) {
cout << feature.GetName() << endl;
} else {
printf("\033[91mGetFeature failed: %s\033[0m\n", ret.message().c_str());
}
GetAccessMode 读取相机属性权限
Feature feature;
CameraApiStatus ret = camera.GetFeature("DepthRangeMax", feature);
AccessMode access_mode;
ret = feature.GetAccessMode(access_mode);
if (ret.IsSuccess()) {
printf("\033[92mDepthRangeMax AccessMode :%d\033[0m\n", access_mode);
}
VCameraSDK 中,属性的权限共有如下四种:
0:表示该相机不支持此属性或当前状态不支持此属性(如开启 AEC 后,曝光时间不支持)。
1:表示该相机此属性为只读。
2:表示该相机此属性为只写。
3:表示该相机此属性为可读可写。
GetType 获取相机属性类型
Feature feature;
camera.GetFeature("Depth/PixelFormat", feature);
FeatureType type = feature.GetType();
printf("\033[91mFeatureType is %d\033[0m\n", static_cast<int>(type));
VCameraSDK 中,属性的类型共有如下八种:
enum class CAMERA_API_EXPORT FeatureType : int32_t {
Undefined,
Bool,
Int64,
Float64,
Enumeration,
String,
ByteArray,
Dictionary,
};
Int64 类
读取参数值
Feature feature;
Value value;
CameraApiStatus ret = camera.GetFeature("DeviceStreamChannelSelector", feature);
ret = feature.GetValue(value);
if (ret.IsSuccess()) {
printf("\033[92mGetValue success : %lld\033[0m\n", (int64_t)value);
}
判断参数类型
Feature feature;
Value value;
CameraApiStatus ret = camera.GetFeature("DeviceStreamChannelSelector", feature);
feature.GetValue(value);
if (value.IsInt64()) {
printf("\033[92mValueType is true\033[0m\n");
}
else {
printf("\033[91mValueType is wrong. ValueType:%d\033[0m\n", value.GetType());
}
读取参数范围
Feature feature;
CameraApiStatus ret = camera.GetFeature("LightController0/LightBrightness", feature);
Int64Range range;
ret = feature.GetRange(range);
if (ret.IsSuccess()) {
printf("\033[92mGetRange success : [%lld ,%lld], step : %lld\033[0m\n", range.minValue, range.maxValue, range.step);
}
设置参数值
Feature feature;
CameraApiStatus ret = camera.GetFeature("LightController0/LightBrightness", feature);
ret = feature.SetValue(10);
if (ret.IsSuccess()) {
printf("\033[92mSetValue success\033[0m\n");
}
else {
printf("\033[91mSetValue call failed : %s\033[0m\n", ret.message().c_str());
}
完整示例
Feature feature;
AccessMode access_mode;
Int64Range range;
Value value;
CameraApiStatus ret = camera.GetFeature("LightController0/LightBrightness", feature);
ret = feature.GetAccessMode(access_mode);
printf("\033[95mAccessMode:%d\033[0m\n", static_cast<int>(access_mode));
ret = feature.GetValue(value);
printf("\033[95mValueType:%d\033[0m\n",value.GetType());
ret = feature.GetRange(range);
printf("\033[95mCurrentValue : %lld , Range : [%lld ,%lld] , Step : %lld\033[0m\n", (int64_t)value, range.minValue, range.maxValue, range.step);
ret = feature.SetValue(Value(80);
Bool类
读取参数值
Feature feature;
CameraApiStatus ret = camera.GetFeature("Texture/ExposureAuto", feature);
Value value;
ret = feature.GetValue(value);
if (ret.IsSuccess()) {
printf("\033[92mGetValue success : %s\033[0m\n", value?"true":"false");
}
判断参数类型
Feature feature;
CameraApiStatus ret = camera.GetFeature("Texture/ExposureAuto", feature);
Value value;
feature.GetValue(value);
if (value.IsBool()) {
printf("\033[92mValueType is Bool\033[0m\n");
}
else {
printf("\033[91mValueType is not Bool\033[0m\n");
}
设置参数值
Feature feature;
CameraApiStatus ret = camera.GetFeature("Texture/ExposureAuto", feature);
Value value;
ret = feature.SetValue(false);
if (ret.IsSuccess()) {
printf("\033[92mSetValue success\033[0m\n");
}
else {
printf("\033[91mSetValue call failed : %s\033[0m\n", ret.message().c_str());
}
完整示例
Feature feature;
AccessMode access_mode;
Value value;
CameraApiStatus ret = camera.GetFeature("Texture/ExposureAuto", feature);
ret = feature.GetAccessMode(access_mode);
printf("\033[95mTexture/ExposureAuto AccessMode:%d\033[0m\n", access_mode);
ret = feature.GetValue(value);
printf("\033[95mValueType:%d\033[0m\n", value.GetType());
printf("\033[95mCurrentValue : %s\033[0m\n", value?"true":"false");
ret = feature.SetValue(true);
Float64 类
读取参数值
Feature feature;
CameraApiStatus ret = camera.GetFeature("DepthScaleUnit", feature);
Value value;
ret = feature.GetValue(value);
if (ret.IsSuccess()) {
printf("\033[92mGetValue success : %f\033[0m\n", (double)value);
}
判断参数类型
Feature feature;
CameraApiStatus ret = camera.GetFeature("DepthScaleUnit", feature);
Value value;
feature.GetValue(value);
if (value.IsDouble()) {
printf("\033[92mValueType is float\033[0m\n");
}
else {
printf("\033[91mValueType is not float\033[0m\n");
}
读取参数范围
Feature feature;
CameraApiStatus ret = camera.GetFeature("DepthScaleUnit", feature);
Float64Range range;
ret = feature.GetRange(range);
if (ret.IsSuccess()) {
printf("\033[92mGetRange success : [%f , %f]\033[0m\n", range.minValue, range.maxValue);
}
设置参数值
Feature feature;
CameraApiStatus ret = camera.GetFeature("DepthScaleUnit", feature);
Value value;
ret = feature.SetValue(Value(0.25);
if (ret.IsSuccess()) {
printf("\033[92mSetValue success\033[0m\n");
}
else {
printf("\033[91mSetValue call failed : %s\033[0m\n", ret.message().c_str());
}
完整示例
Feature feature;
AccessMode access_mode;
Float64Range range;
Value value;
CameraApiStatus ret = camera.GetFeature("DepthScaleUnit", feature);
ret = feature.GetAccessMode(access_mode);
printf("\033[95mDepthScaleUnit AccessMode:%d\033[0m\n", access_mode);
ret = feature.GetValue(value);
printf("\033[95mValueType:%d\033[0m\n", value.GetType());
ret = feature.GetRange(range);
printf("\033[95mCurrentValue : %f , Range : [%f ,%f] , Step : %f\033[0m\n", (double)value, range.minValue, range.maxValue, range.step);
ret = feature.SetValue(0.25);
Enumeration 类
读取参数值
Feature feature;
CameraApiStatus ret = camera.GetFeature("Texture/BinningHorizontal", feature);
Value value;
ret = feature.GetValue(value);
if (ret.IsSuccess()) {
printf("\033[92mGetValue success : %d\033[0m\n", (int64_t)value);
}
判断参数类型
Feature feature;
CameraApiStatus ret = camera.GetFeature("DeviceTimeSyncMode", feature);
Value value;
feature.GetValue(value);
if (value.IsInt64()) {
printf("\033[92mValueType is Enum\033[0m\n");
}
else {
printf("\033[91mValueType is not Enum\033[0m\n");
}
读取列表
Feature feature;
CameraApiStatus ret = camera.GetFeature("DeviceTimeSyncMode", feature);
std::vector<EnumItem> enum_list;
ret = feature.GetEnumItems(enum_list);
if (ret.IsSuccess()) {
printf("\033[92mGetEnumItems success\033[0m\n");
for (auto& list : enum_list) {
printf("Name : %s ,Value :%d\n", list.name.c_str(), list.value);
}
}
设置参数值
Feature feature;
CameraApiStatus ret = camera.GetFeature("DeviceTimeSyncMode", feature);
std::vector<EnumItem> enum_list;
feature.GetEnumItems(enum_list);
ret = feature.SetValue(enum_list[1].value);
if (ret.IsSuccess()) {
printf("\033[92mSetValue success\033[0m\n");
}
else {
printf("\033[91mSetValue Call failed :%s\033[0m\n", ret.message().c_str());
}
完整示例
Feature feature;
AccessMode access_mode;
Value value;
CameraApiStatus ret = camera.GetFeature("DeviceTimeSyncMode", feature);
ret = feature.GetAccessMode(access_mode);
printf("\033[95mDeviceTimeSyncMode AccessMode:%d\033[0m\n", access_mode);
ret = feature.GetValue(value);
printf("\033[95mValueType:%d\033[0m\n", value.GetType());
printf("\033[95mCurretnValue : %d\033[0m\n", (int64_t)value);
std::vector<EnumItem> enum_list;
ret = feature.GetEnumItems(enum_list);
if (ret.IsSuccess()) {
printf("\033[92mGetEnumItems success\033[0m\n");
for (auto& list : enum_list) {
printf("Name : %s ,Value :%d\n", list.name.c_str(), list.value);
//Set
ret = feature.SetValue(list.value);
if (ret.IsSuccess()) {
printf("\033[92mSetValue success\033[0m\n");
}
else {
printf("\033[91mSetValue Call failed :%s\033[0m\n", ret.message().c_str());
}
}
}