API 使用说明
SDK 4.X.X 版本兼容并实现了 GenICam 标准规范的核心功能模块,包含标准特征命名规范、统一的参数访问接口等等。
API 一览表
(适用于所有相机)
- TYInitLib
- TYLibVersion
- TYUpdateInterfaceList
- TYGetInterfaceNumber
- TYGetInterfaceList
- TYOpenInterface
- TYUpdateDeviceList
- TYGetDeviceNumber
- TYGetDeviceList
- TYOpenDevice
- TYGetFrameBufferSize
- TYEnqueueBuffer
- TYStartCapture
- TYFetchFrame
- ty_comp_window_name
- ty_image_info
- TYGetDecodeBufferSize
- TYGetDecodeTargetPixFmt
- TYDecodeImage
- TYDisplayImage
- TYStopCapture
- TYClearBufferQueue
- TYCloseDevice
- TYCloseInterface
- TYDeinitLib
- TYUndistortImage2
(适用于所有相机)
TYInitLib库加载
ASSERT_OK( TYInitLib() );
TYLibVersion获取 SDK 版本信息
TY_VERSION_INFO ver;
ASSERT_OK( TYLibVersion(&ver) );
LOGD(" - lib version: %d.%d.%d", ver.major, ver.minor, ver.patch);
TYUpdateInterfaceList更新接口状态
LOGD("Update interface list");
ASSERT_OK( TYUpdateInterfaceList() );
TYGetInterfaceNumber获取接口数量
uint32_t n = 0;
ASSERT_OK( TYGetInterfaceNumber(&n) );
LOGD("Got %u interface list", n);
TYGetInterfaceList获取接口列表
std::vector<TY_INTERFACE_INFO> ifaces(n);
ASSERT_OK( TYGetInterfaceList(&ifaces[0], n, &n) );
ASSERT( n == ifaces.size() );
for(uint32_t i = 0; i < n; i++)
{
LOGI("Found interface %u:", i);
LOGI(" name: %s", ifaces[i].name);
LOGI(" id: %s", ifaces[i].id);
LOGI(" type: 0x%x", ifaces[i].type);
if(TYIsNetworkInterface(ifaces[i].type))
{
LOGI(" MAC: %s", ifaces[i].netInfo.mac);
LOGI(" ip: %s", ifaces[i].netInfo.ip);
LOGI(" netmask: %s", ifaces[i].netInfo.netmask);
LOGI(" gateway: %s", ifaces[i].netInfo.gateway);
LOGI(" broadcast: %s", ifaces[i].netInfo.broadcast);
}
}
TYOpenInterface打开接口
如网卡 MAC 地址为:88-a4-c2-b1-35-e3,IP地址为:192.168.6.45 (对应16进制的小端存储为2d06a8c0),则指定网卡时需要写成 “eth-88-a4-c2-b1-35-e32d06a8c0”,注意区分大小写。
char* iface_id = "eth-88-a4-c2-b1-35-e32d06a8c0";
ASSERT_OK(TYOpenInterface(iface_id, &hIface));
TYUpdateDeviceList更新相机列表
设备信息包含以下数据:
typedef struct TY_DEVICE_BASE_INFO
{
TY_INTERFACE_INFO iface;
char id[32];///<device serial number
char vendorName[32];
char userDefinedName[32];
char modelName[32];///<device model name
TY_VERSION_INFO hardwareVersion; ///<deprecated
TY_VERSION_INFO firmwareVersion;///<deprecated
union {
TY_DEVICE_NET_INFO netInfo;
TY_DEVICE_USB_INFO usbInfo;
};
char buildHash[256];
char configVersion[256];
char reserved[256];
}TY_DEVICE_BASE_INFO;
用法请参见示例程序中的 selectDevice 函数。
TYGetDeviceNumber获取设备数量
uint32_t n = 0;
TYGetDeviceNumber(hIface, &n);
TYGetDeviceList获取相机列表
std::vector<TY_DEVICE_BASE_INFO> devs(n);
TYGetDeviceList(hIface, &devs[0], n, &n);
TYOpenDevice打开相机
ASSERT_OK( TYOpenDevice(hIface, selectedDev.id, &hDevice) );
TYGetFrameBufferSize获取帧缓冲空间大小
获取当前设备配置需要的帧缓冲空间大小。
uint32_t frameSize;
ASSERT_OK( TYGetFrameBufferSize(hDevice, &frameSize) );
LOGD(" - Get size of framebuffer, %d", frameSize);
TYEnqueueBuffer分配帧缓冲并入队
把分配的帧缓冲推入缓冲队列。
char* frameBuffer[2] = {0};
LOGD(" - Allocate & enqueue buffers");
frameBuffer[0] = new char[frameSize];
frameBuffer[1] = new char[frameSize];
LOGD(" - Enqueue buffer (%p, %d)", frameBuffer[0], frameSize);
ASSERT_OK( TYEnqueueBuffer(hDevice, frameBuffer[0], frameSize) );
LOGD(" - Enqueue buffer (%p, %d)", frameBuffer[1], frameSize);
ASSERT_OK( TYEnqueueBuffer(hDevice, frameBuffer[1], frameSize) );
TYStartCapture开始图像采集
LOGD("Start capture");
ASSERT_OK( TYStartCapture(hDevice) );
TYFetchFrame数据接收
在指定的时间内等待有效数据帧,指定时间内没有收到数据帧,函数会返回并报告错误状态。设置指定时间的单位:ms。
TYFetchFrame(hDevice, &frame, -1);
解析图像
ty_comp_window_name:根据componentID生成一个窗口标题。
ty_image_info:将SDK原始的图片格式转换为能够解析的格式。
TYGetDecodeBufferSize:判断图像格式是否为压缩格式。
TYGetDecodeTargetPixFmt:根据输入图像格式和指定的输出配置,确定解码操作将生成的目标像素格式。
TYDecodeImage:压缩数据解压为原始像素
TYDisplayImage:读取图像信息并创建窗口显示图像。
for (int i = 0; i < frame.validCount; i++){
if (frame.image[i].status != TY_STATUS_OK) continue;
uint32_t destSize;
auto win = ty_comp_window_name(frame.image[i].componentID);
TYImageInfo image_info = ty_image_info(frame.image[i]);
TYDecodeError err = TYGetDecodeBufferSize(&image_info, &destSize, TY_OUTPUT_FORMAT_AUTO);
if(err == TY_DECODE_SUCCESS) {
TYDecodeResult retInfo;
std::vector<uint8_t> image_data(destSize);
ASSERT_OK(TYDecodeImage(&image_info, TY_OUTPUT_FORMAT_AUTO, (void*)&image_data[0], destSize, &retInfo));
TYDisplayImage(win.c_str(), retInfo.width, retInfo.height, retInfo.format, &image_data[0]);
} else {
TYDisplayImage(win.c_str(), frame.image[i].width, frame.image[i].height, frame.image[i].pixelFormat, frame.image[i].buffer);
}
}
TYStopCapture停止图像采集
TYStopCapture(hDevice);
TYClearBufferQueue清除缓冲队列
TYClearBufferQueue(hDevice);
TYCloseDevice关闭相机
TYCloseDevice(hDevice);
TYCloseInterface关闭接口
TYCloseInterface(hIface);
TYDeinitLib库卸载
TYDeinitLib();
TYEnableLog使能日志输出
当前支持的日志输出模式有:STD(输出日志到终端)、File(输出日志到文件)、Server(输出日志到服务器)。
ASSERT_OK(TYEnableLog(TY_LOG_TYPE_STD));//使能日志输出到终端
ASSERT_OK(TYEnableLog(TY_LOG_TYPE_FILE));//使能日志输出到文件
ASSERT_OK(TYEnableLog(TY_LOG_TYPE_SERVER));//使能日志输出到服务器
TYDisableLog关闭日志输出
ASSERT_OK(TYDisableLog (TY_LOG_TYPE_STD));//关闭日志输出到终端
ASSERT_OK(TYDisableLog (TY_LOG_TYPE_FILE));//关闭日志输出到文件
ASSERT_OK(TYDisableLog (TY_LOG_TYPE_SERVER));//关闭日志输出到服务器
TYSetLogLevel设置日志输出级别
设置日志系统的输出级别。输出优先级为:VERBOSE ⊃ DEBUG ⊃ INFO ⊃ WARNING ⊃ ERROR。
定义:
typedef enum TY_LOG_LEVEL_LIST
{
TY_LOG_LEVEL_VERBOSE = 1,
TY_LOG_LEVEL_DEBUG = 2,
TY_LOG_LEVEL_INFO = 3,
TY_LOG_LEVEL_WARNING = 4,
TY_LOG_LEVEL_ERROR = 5,
TY_LOG_LEVEL_NEVER = 9,
}TY_LOG_LEVEL_LIST;
typedef int32_t TY_LOG_LEVEL;
// 设置为 DEBUG 级别
ASSERT_OK(TYSetLogLevel(TY_LOG_TYPE_FILE, TY_LOG_LEVEL_DEBUG));
TYSetLogPrefix设置日志前缀
为日志添加自定义前缀,方便区分不同来源的日志。
ASSERT_OK(TYSetLogPrefix("PERCIPIO SDK"));
TYCfgLogFile配置日志文件
当使能日志输出到文件时,需配置日志文件名、日志文件大小、日志文件数量。如果不通过 TYCfgLogFile 手动配置,日志将自动保存至默认路径的 percipio.log 。
方式1:通过 TYCfgLogFile 手动配置日志文件名、文件大小、文件数量。
ASSERT_OK(TYEnableLog(TY_LOG_TYPE_FILE));
ASSERT_OK(TYSetLogLevel(TY_LOG_TYPE_FILE, TY_LOG_LEVEL_ERROR));
ASSERT_OK(TYCfgLogFile("2025109log.txt",100000,10));
其中:
100000 代表每个文件的大小为 100000 bit。缺省时默认为 10000 bit。
10 代表日志文件最大数量为 10 个。缺省时默认为 10 个。
方式2:日志输出至默认路径下的 percipio.log。
ASSERT_OK(TYEnableLog(TY_LOG_TYPE_FILE));
ASSERT_OK(TYSetLogLevel(TY_LOG_TYPE_FILE, TY_LOG_LEVEL_ERROR));
LOGD("Path is :%s", std::getenv("TEMP"));
//LOGD("Path is :%s", std::getenv("TMP"));
//LOGD("Path is :%s", std::getenv("TMPDIR") );
其中:
Windows 系统通过
LOGD("Path is :%s", std::getenv("TEMP"));或LOGD("Path is :%s", std::getenv("TMP"));获取默认路径。Linux 系统通过
LOGD("Path is :%s", std::getenv("TMPDIR") );获取默认路径。
TYCfgLogServer配置存储日志的服务器
当使能日志输出到服务器时,需配置目标服务器类型、目标服务器 IP 地址、目标服务器的端口。当前有 2 种服务器类型,TY_SERVER_TYPE_UDP和TY_SERVER_TYPE_TCP。
ASSERT_OK(TYEnableLog(TY_LOG_TYPE_SERVER));
ASSERT_OK(TYCfgLogServer(TY_SERVER_TYPE_TCP,"192.168.6.77", 8000));
ASSERT_OK(TYSetLogLevel(TY_LOG_TYPE_SERVER, TY_LOG_LEVEL_ERROR));
TYParamExist判断相机是否支持某个属性
bool exist = false;
TYParamExist(hDevice, "TriggerSoftware", &exist);
printf("This feature is: %d\n", exist);
TYParamGetToolTip获取属性提示信息
char str[1024];
ASSERT_OK(TYParamGetToolTip(hDevice,"Distortion",str,sizeof(str)));
std::cout << "ToolTip:" << str << std::endl;
TYParamGetDescriptor获取属性描述信息
char str[1024];
ASSERT_OK(TYParamGetDescriptor(hDevice,"Distortion",str,sizeof(str)));
std::cout << "Descriptor:" << str << std::endl;
TYParamGetDisplayName获取属性用于显示的名称
char str[1024];
ASSERT_OK(TYParamGetDisplayName(hDevice,"Distortion",str,sizeof(str)));
std::cout << "DisplayName:" << str << std::endl;
TYParamGetType获取属性数据类型
定义:
enum ParamType {
Command,
Integer,
Float,
Boolean,
Enumeration,
String,
ByteArray,
};
获取属性数据类型方法如下:
ParamType type;
ASSERT_OK(TYParamGetType(hDevice,"UserSetLoad",&type));
printf("Distortion type %d", type);
TYParamGetAccess获取属性读写权限
定义:
typedef enum TY_ACCESS_MODE_LIST :uint32_t
{
TY_ACCESS_READABLE = 0x1,
TY_ACCESS_WRITABLE = 0x2,
}TY_ACCESS_MODE_LIST;
typedef uint8_t TY_ACCESS_MODE;
获取属性读写权限方法如下:
TY_ACCESS_MODE access_mode;
ASSERT_OK(TYParamGetAccess(hDevice, "DeviceFirmwareVersion", &access_mode));
printf("DeviceFirmwareVersion access mode %d\n", access_mode);
TYParamGetVisibility获取属性的可见等级
定义:
typedef enum TY_VISIBILITY_TYPE
{
BEGINNER = 0,
EXPERT = 1,
GURU = 2,
INVLISIBLE = 3
}TY_VISIBILITY_TYPE;
获取属性的可见等级方法如下:
TY_VISIBILITY_TYPE visibility;
ASSERT_OK(TYParamGetVisibility(hDevice, "DeviceFirmwareVersion", &visibility));
printf("DeviceFirmwareVersion visibility %d\n", visibility);
TYFloatGetUnit获取浮点型属性的单位
int64_t min_brightness, max_brightness, step;
ASSERT_OK(TYEnumSetString(hDevice, "SourceSelector", "Texture"));
ASSERT_OK(TYBooleanSetValue(hDevice, "ComponentEnable", true));
ASSERT_OK(TYBooleanSetValue(hDevice, "ExposureAuto", false));
char unit[1024];
ASSERT_OK(TYFloatGetUnit(hDevice, "ExposureTime", unit, sizeof(unit)));
printf("ExposureTime unit : %s\n", unit);
下表浮点型属性支持读取单位。
属性名 |
单位 |
|---|---|
DeviceTemperature |
C |
ExposureTime |
us |
TYIntegerGetUnit获取整型属性的单位
char unit[1024];
ASSERT_OK(TYIntegerGetUnit(hDevice, "DeviceLinkSpeed", unit, sizeof(unit)));
printf("DeviceLinkSpeed unit : %s\n", unit);
下表整型属性支持读取单位。
属性名 |
单位 |
|---|---|
DepthRangeMin |
mm |
DepthRangeMax |
mm |
DeviceLinkHeartbeatTimeout |
ms |
DeviceFrameRecvTime0ut |
ms |
DeviceLinkSpeed |
Mbps |
各类属性操作接口 (适用于 Gige_2_1 相机)
Command 命令型属性
提供以下接口:
TY_CAPI TYCommandExec (TY_DEV_HANDLE hDevice, const char* feat);
使用示例:
//通过此命令控制相机采图 ASSERT_OK(TYCommandExec(hDevice, "TriggerSoftware"));
Integer 整型属性
提供以下接口:
TY_CAPI TYIntegerSetValue (TY_DEV_HANDLE hDevice, const char* feat, int64_t value); TY_CAPI TYIntegerGetValue (TY_DEV_HANDLE hDevice, const char* feat, int64_t* value); TY_CAPI TYIntegerGetMin (TY_DEV_HANDLE hDevice, const char* feat, int64_t* min); TY_CAPI TYIntegerGetMax (TY_DEV_HANDLE hDevice, const char* feat, int64_t* max); TY_CAPI TYIntegerGetStep (TY_DEV_HANDLE hDevice, const char* feat, int64_t* step); TY_CAPI TYIntegerGetUnit (TY_DEV_HANDLE hDevice, const char* feat, char* pBuffer, uint32_t bufferSize);
使用示例:
int64_t default_PacketSize,min_PacketSize, max_PacketSize, packet_step, value; ASSERT_OK(TYIntegerGetValue(hDevice, "DeviceStreamChannelPacketSize", &default_PacketSize)); ASSERT_OK(TYIntegerGetMin(hDevice, "DeviceStreamChannelPacketSize", &min_PacketSize)); ASSERT_OK(TYIntegerGetMax(hDevice, "DeviceStreamChannelPacketSize", &max_PacketSize)); ASSERT_OK(TYIntegerGetStep(hDevice, "DeviceStreamChannelPacketSize", &packet_step)); //设置 PacketSize 值 ASSERT_OK(TYIntegerSetValue(hDevice, "DeviceStreamChannelPacketSize", min_PacketSize)); ASSERT_OK(TYIntegerGetValue(hDevice, "DeviceStreamChannelPacketSize", &value)); LOGD("DeviceStreamChannelPacketSize default=%d range: [%lld, %lld], step: %lld,value=%lld", default_PacketSize, min_PacketSize, max_PacketSize, packet_step, value);
Float 浮点型属性
提供以下接口:
TY_CAPI TYFloatSetValue (TY_DEV_HANDLE hDevice, const char* feat, double value); TY_CAPI TYFloatGetValue (TY_DEV_HANDLE hDevice, const char* feat, double* value); TY_CAPI TYFloatGetMin (TY_DEV_HANDLE hDevice, const char* feat, double* min); TY_CAPI TYFloatGetMax (TY_DEV_HANDLE hDevice, const char* feat, double* max); TY_CAPI TYFloatGetStep (TY_DEV_HANDLE hDevice, const char* feat, double* step); TY_CAPI TYFloatGetUnit (TY_DEV_HANDLE hDevice, const char* feat, char* pBuffer, uint32_t bufferSize);
使用示例:
//设置组件 ASSERT_OK(TYEnumSetString(hDevice, "SourceSelector", "Depth")); double Suint_out = -1, Suint_min = -1, Suint_max = -1, Suint_step = -1, value; ASSERT_OK(TYFloatGetValue(hDevice, "DepthScaleUnit", &Suint_out)); ASSERT_OK(TYFloatGetMin(hDevice, "DepthScaleUnit", &Suint_min)); ASSERT_OK(TYFloatGetMax(hDevice, "DepthScaleUnit", &Suint_max)); ASSERT_OK(TYFloatGetStep(hDevice, "DepthScaleUnit", &Suint_step)); //设置 DepthScaleUnit 值 ASSERT_OK(TYFloatSetValue(hDevice, "DepthScaleUnit", Suint_max)); ASSERT_OK(TYFloatGetValue(hDevice, "DepthScaleUnit", &value)); LOGD(" get value=%f, range: %f-%f,step:%f\n", Suint_out, Suint_min, Suint_max, Suint_step, value);
Boolean 布尔型属性
提供以下接口:
TY_CAPI TYBooleanSetValue (TY_DEV_HANDLE hDevice, const char* feat, bool value); TY_CAPI TYBooleanGetValue (TY_DEV_HANDLE hDevice, const char* feat, bool* value);
使用示例:
bool CmosSync,CmosSync_after; ASSERT_OK(TYBooleanGetValue(hDevice, "CmosSync", &CmosSync)); LOGD("CmosSync=%d", CmosSync); ASSERT_OK(TYBooleanSetValue(hDevice, "CmosSync", 0)); ASSERT_OK(TYBooleanGetValue(hDevice, "CmosSync", &CmosSync_after)); LOGD("CmosSync_after=%d", CmosSync_after);
Enum 枚举型属性
提供以下接口:
TY_CAPI TYEnumSetValue (TY_DEV_HANDLE hDevice, const char* feat, int32_t value); TY_CAPI TYEnumSetString (TY_DEV_HANDLE hDevice, const char* feat, const char* name); TY_CAPI TYEnumGetValue (TY_DEV_HANDLE hDevice, const char* feat, int32_t* value); TY_CAPI TYEnumGetString (TY_DEV_HANDLE hDevice, const char* feat, char* name, const uint32_t length); TY_CAPI TYEnumGetEntryCount (TY_DEV_HANDLE hDevice, const char* feat, uint32_t* cnt); TY_CAPI TYEnumGetEntryInfo (TY_DEV_HANDLE hDevice, const char* feat, TYEnumEntry* pEnumEntry, uint32_t entryCount, uint32_t* pFilledEntryCount);
使用示例:
//设置组件 ASSERT_OK(TYEnumSetString(hDevice, "SourceSelector", "Depth")); //使能组件 ASSERT_OK(TYBooleanSetValue(hDevice, "ComponentEnable", true)); uint32_t _cnt = 0; ASSERT_OK(TYEnumGetEntryCount(hDevice, "PixelFormat", &_cnt)); std::vector<TYEnumEntry> _cnt_entry(_cnt); ASSERT_OK(TYEnumGetEntryInfo(hDevice, "PixelFormat", _cnt_entry.data(), _cnt, &_cnt)); std::cout << "PixelFormat" << " has " << _cnt << " kinds of " << "PixelFormat" << std::endl; for (int i = 0; i < _cnt; i++) { std::cout << " Name : " << _cnt_entry[i].name << " value : " << _cnt_entry[i].value << std::endl; } ASSERT_OK(TYEnumSetString(hDevice, "PixelFormat", _cnt_entry[0].name));
String 字符串型属性
提供以下接口:
TY_CAPI TYStringSetValue (TY_DEV_HANDLE hDevice, const char* feat, const char* pBuffer); TY_CAPI TYStringGetLength (TY_DEV_HANDLE hDevice, const char* feat, uint32_t* pLength); TY_CAPI TYStringGetValue (TY_DEV_HANDLE hDevice, const char* feat, char* pBuffer, uint32_t bufferSize);
使用示例:
//设置 ASSERT_OK(TYStringSetValue(hDevice, "UserSetDescription", "hahahahaha")); //读取 uint32_t len = 0; ASSERT_OK(TYStringGetLength(hDevice, "UserSetDescription", &len)); std::string hash(len, '\0'); ASSERT_OK(TYStringGetValue(hDevice, "UserSetDescription", &hash[0], len)); std::cout << "UserSetDescription : " << hash << std::endl;
ByteArray 数组型属性
提供以下接口:
TY_CAPI TYByteArrayGetSize (TY_DEV_HANDLE hDevice, const char* feat, uint32_t* pSize); TY_CAPI TYByteArraySetValue (TY_DEV_HANDLE hDevice, const char* feat, const uint8_t* pBuffer, uint32_t bufferSize); TY_CAPI TYByteArrayGetValue (TY_DEV_HANDLE hDevice, const char* feat, uint8_t* buffer, uint32_t bufferSize);
使用示例:
//文件顶部应该包含: #include <iomanip> ASSERT_OK(TYEnumSetString(hDevice, "SourceSelector", "Texture")); //读取外参矩阵 double mat_extrinsic_4x4[16]; ASSERT_OK(TYByteArrayGetValue(hDevice, "Extrinsic", reinterpret_cast<uint8_t*>(mat_extrinsic_4x4), sizeof(mat_extrinsic_4x4))); std::cout << "\t\t" << std::setw(12) << std::setfill(' ') << std::fixed << std::setprecision(6) << mat_extrinsic_4x4[0] << std::setw(12) << mat_extrinsic_4x4[1] << std::setw(12) << mat_extrinsic_4x4[2] << std::setw(12) << mat_extrinsic_4x4[3] << std::endl; std::cout << "\t\t" << std::setw(12) << std::setfill(' ') << std::fixed << std::setprecision(6) << mat_extrinsic_4x4[4] << std::setw(12) << mat_extrinsic_4x4[5] << std::setw(12) << mat_extrinsic_4x4[6] << std::setw(12) << mat_extrinsic_4x4[7] << std::endl; std::cout << "\t\t" << std::setw(12) << std::setfill(' ') << std::fixed << std::setprecision(6) << mat_extrinsic_4x4[8] << std::setw(12) << mat_extrinsic_4x4[9] << std::setw(12) << mat_extrinsic_4x4[10] << std::setw(12) << mat_extrinsic_4x4[11] << std::endl; std::cout << "\t\t" << std::setw(12) << std::setfill(' ') << std::fixed << std::setprecision(6) << mat_extrinsic_4x4[12] << std::setw(12) << mat_extrinsic_4x4[13] << std::setw(12) << mat_extrinsic_4x4[14] << std::setw(12) << mat_extrinsic_4x4[15] << std::endl;
TYHasFeature查询属性有无
输入设备句柄、组件 ID,查询是否支持 featureID 对应的属性。
bool HasFeature =false;
ASSERT_OK(TYHasFeature(hDevice, TY_COMPONENT_IR_CAM_LEFT,TY_INT_EXPOSURE_TIME , &HasFeature));
LOGD("TY_ENUM_TEMPERATURE_ID%10s%d","", HasFeature);
TYGetFeatureInfo查询属性信息
输入设备句柄、组件 ID,查询 featureID 对应属性的信息。
属性的信息包括:访问属性(读、写)、是否支持图像运行时配置以及该属性相关联的组件和其他属性 ID。
typedef struct TY_FEATURE_INFO
{
bool isValid; ///< true if feature exists, false otherwise
TY_ACCESS_MODE accessMode; ///< feature access privilege
bool writableAtRun; ///< feature can be written while capturing
char reserved0[1];
TY_COMPONENT_ID componentID; ///< owner of this feature
TY_FEATURE_ID featureID; ///< feature unique id
char name[32]; ///< describe string
int32_t bindComponentID; ///< component ID current feature bind to
int32_t bindFeatureID; ///< feature ID current feature bind to
char reserved[252];
}TY_FEATURE_INFO;
示例:
TY_FEATURE_INFO info;
ASSERT_OK(TYGetFeatureInfo(hDevice, TY_COMPONENT_IR_CAM_LEFT, TY_INT_EXPOSURE_TIME, &info));
LOGD("TY_INT_EXPOSURE_TIME name %s",info.name);
LOGD("TY_INT_EXPOSURE_TIME featureID = 0x%04" PRIx32, info.featureID);
LOGD("TY_INT_EXPOSURE_TIME componentID= 0x%08" PRIx32,info.componentID);
各类属性操作接口 (适用于 Gige_2_0 相机)
Int 整型属性
提供以下接口:
TY_CAPI TYGetIntRange (TY_DEV_HANDLE hDevice, TY_COMPONENT_ID componentID, TY_FEATURE_ID featureID, TY_INT_RANGE* intRange); TY_CAPI TYGetInt (TY_DEV_HANDLE hDevice, TY_COMPONENT_ID componentID, TY_FEATURE_ID featureID, int32_t* value); TY_CAPI TYSetInt (TY_DEV_HANDLE hDevice, TY_COMPONENT_ID componentID, TY_FEATURE_ID featureID, int32_t value);
使用示例:
ASSERT_OK(TYSetInt(hDevice, TY_COMPONENT_DEVICE, TY_INT_ACCEPTABLE_PERCENT, 90));
Float 浮点型属性
提供以下接口:
TY_CAPI TYGetFloatRange (TY_DEV_HANDLE hDevice, TY_COMPONENT_ID componentID, TY_FEATURE_ID featureID, TY_FLOAT_RANGE* floatRange); TY_CAPI TYGetFloat (TY_DEV_HANDLE hDevice, TY_COMPONENT_ID componentID, TY_FEATURE_ID featureID, float* value); TY_CAPI TYSetFloat (TY_DEV_HANDLE hDevice, TY_COMPONENT_ID componentID, TY_FEATURE_ID featureID, float value);
使用示例:
float value = 0.25; ASSERT_OK(TYSetFloat(hDevice, TY_COMPONENT_DEPTH_CAM, TY_FLOAT_SCALE_UNIT,value));
Enum 枚举型属性
提供以下接口:
TY_CAPI TYGetEnumEntryCount (TY_DEV_HANDLE hDevice, TY_COMPONENT_ID componentID, TY_FEATURE_ID featureID, uint32_t* entryCount); TY_CAPI TYGetEnumEntryInfo (TY_DEV_HANDLE hDevice, TY_COMPONENT_ID componentID, TY_FEATURE_ID featureID, TY_ENUM_ENTRY* entries, uint32_t entryCount, uint32_t* filledEntryCount); TY_CAPI TYGetEnum (TY_DEV_HANDLE hDevice, TY_COMPONENT_ID componentID, TY_FEATURE_ID featureID, int32_t* value); TY_CAPI TYSetEnum (TY_DEV_HANDLE hDevice, TY_COMPONENT_ID componentID, TY_FEATURE_ID featureID, int32_t value);
使用示例:
ASSERT_OK(TYSetEnum(hDevice, TY_COMPONENT_DEVICE, TY_ENUM_STREAM_ASYNC, TY_STREAM_ASYNC_RGB));
Bool 布尔型属性
提供以下接口:
TY_CAPI TYGetBool (TY_DEV_HANDLE hDevice, TY_COMPONENT_ID componentID, TY_FEATURE_ID featureID, bool* value); TY_CAPI TYSetBool (TY_DEV_HANDLE hDevice, TY_COMPONENT_ID componentID, TY_FEATURE_ID featureID, bool value);
使用示例:
ASSERT_OK(TYSetBool(hDevice, TY_COMPONENT_DEVICE, TY_BOOL_GVSP_RESEND, true));
String 字符串型属性
提供以下接口:
TY_CAPI TYGetStringLength (TY_DEV_HANDLE hDevice, TY_COMPONENT_ID componentID, TY_FEATURE_ID featureID, uint32_t* length); TY_CAPI TYGetString (TY_DEV_HANDLE hDevice, TY_COMPONENT_ID componentID, TY_FEATURE_ID featureID, char* buffer, uint32_t bufferSize); TY_CAPI TYSetString (TY_DEV_HANDLE hDevice, TY_COMPONENT_ID componentID, TY_FEATURE_ID featureID, const char* buffer);
Struct 结构体型属性
提供以下接口:
TY_CAPI TYGetStruct (TY_DEV_HANDLE hDevice, TY_COMPONENT_ID componentID, TY_FEATURE_ID featureID, void* pStruct, uint32_t structSize); TY_CAPI TYSetStruct (TY_DEV_HANDLE hDevice, TY_COMPONENT_ID componentID, TY_FEATURE_ID featureID, void* pStruct, uint32_t structSize);
使用示例:
TY_AEC_ROI_PARAM roi; roi.x = 0; roi.y = 0; roi.w = 100; roi.h = 100; ASSERT_OK(TYSetStruct(hDevice, TY_COMPONENT_RGB_CAM, TY_STRUCT_AEC_ROI, &roi, sizeof(roi)));
TYUndistortImage2 V系列相机IR矫正
TY_CAMERA_ROTATION cameraRotation;
TY_CAMERA_INTRINSIC cameraRectifiedIntrinsic;
TYLensOpticalType lens = TY_LENS_PINHOLE;
TY_CAMERA_CALIB_INFO ir_calib_info;
TYGetStruct(hDevice, TY_COMPONENT_IR_CAM_LEFT, TY_STRUCT_CAM_RECTIFIED_ROTATION, &cameraRotation, sizeof(cameraRotation));
TYGetStruct(hDevice, TY_COMPONENT_IR_CAM_LEFT, TY_STRUCT_CAM_RECTIFIED_INTRI, &cameraRectifiedIntrinsic, sizeof(cameraRectifiedIntrinsic));
TYGetStruct(hDevice, TY_COMPONENT_IR_CAM_LEFT, TY_STRUCT_CAM_CALIB_DATA, &ir_calib_info, sizeof(ir_calib_info));
TY_IMAGE_DATA src;
src.width = irl.cols;
src.height = irl.rows;
src.size = ir_image_size;
src.pixelFormat = fmt;
src.buffer = irl.data;
TY_IMAGE_DATA dst;
dst.width = irl.cols;
dst.height = irl.rows;
dst.size = ir_image_size;
dst.pixelFormat = fmt;
dst.buffer = rectified_ir.data;
ASSERT_OK(TYUndistortImage2 (&ir_calib_info,&src,&cameraRotation,&cameraRectifiedIntrinsic,&dst,lens));