API 使用说明

SDK 4.X.X 版本兼容并实现了 GenICam 标准规范的核心功能模块,包含标准特征命名规范、统一的参数访问接口等等。

API 一览表

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);

解析图像

  1. ty_comp_window_name:根据componentID生成一个窗口标题。

  2. ty_image_info:将SDK原始的图片格式转换为能够解析的格式。

  3. TYGetDecodeBufferSize:判断图像格式是否为压缩格式。

  4. TYGetDecodeTargetPixFmt:根据输入图像格式和指定的输出配置,确定解码操作将生成的目标像素格式。

  5. TYDecodeImage:压缩数据解压为原始像素

  6. 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 相机)

  1. Command 命令型属性

    提供以下接口:

    TY_CAPI  TYCommandExec                  (TY_DEV_HANDLE hDevice, const char* feat);
    

    使用示例:

    //通过此命令控制相机采图
    ASSERT_OK(TYCommandExec(hDevice, "TriggerSoftware"));
    
  2. 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);
    
  3. 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);
    
  4. 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);
    
  5. 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));
    
  6. 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;
    
  7. 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 相机)

  1. 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));
    
  2. 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));
    
  3. 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));
    
  4. 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));
    
  5. 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);
    
  6. 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));