KSJXS SDK 示例代码
基于真实接口的最小可用示例:主动采集 3D 点云、回调模式取轮廓、参数与触发配置。
以下示例使用头文件中的真实接口名(注意
KSJXS_Inital的拼写)。
示例一:主动采集一帧 3D 点云(nMode = 1)
#include "KSJXS_Device.h"
#include <cstdio>
int main()
{
// 1) 初始化(可选先开日志)
KSJXS_SetLog(true, nullptr, 2);
if (KSJXS_Inital() != KSJXS_RET_SUCCESS) {
return -1;
}
// 2) 枚举设备
KSJXS_DEVICE_INFO_LIST list{};
if (KSJXS_EnumDevices(&list) != KSJXS_RET_SUCCESS || list.nDeviceNum == 0) {
printf("未找到设备\n");
KSJXS_UnInitial();
return -1;
}
// 3) 创建句柄并打开设备
void* handle = nullptr;
KSJXS_CreateDeviceHandle(&handle, list.pDeviceInfo[0]);
KSJXS_OpenDevice(handle);
// 4) 先设数据格式,再取 ROI(顺序约束)
KSJXS_SetDataFormat(handle, KSJXS_DF_NON_UNIFORM);
int colStart = 0, rowStart = 0, colSize = 0, rowSize = 0;
KSJXS_GetRoi(handle, &colStart, &rowStart, &colSize, &rowSize);
// 5) 关键参数(按需)
KSJXS_SetExposureTime(handle, 1.0f); // 单位 ms
KSJXS_SetYResolution(handle, 0.05f); // 运动方向精度,单位 mm
// 6) 主动采集模式取一帧
KSJXS_StartAcquisition(handle, 1);
CaptureData* data = nullptr;
if (KSJXS_CaptureData(handle, &data) == KSJXS_RET_SUCCESS && data != nullptr) {
// 数据格式为 KSJXS_DF_NON_UNIFORM → 解析 capPtCloud
int nProfiles = data->capPtCloud.pParam->nPointNum; // 单轮廓点数
float* x = data->capPtCloud.x;
float* z = data->capPtCloud.z;
for (int i = 0; i < nProfiles; ++i) {
if (x[i] <= -1000.0f) continue; // 跳过无效点
// ... 使用 (x[i], z[i]) 做测量 ...
}
KSJXS_ReleaseData(handle, data); // 必须释放
} else {
printf("采集失败,错误码 %d\n", data ? KSJXS_RET_FAIL : KSJXS_RET_TIMEOUT);
}
KSJXS_StopAcquisition(handle);
// 7) 收尾
KSJXS_CloseDevice(handle);
KSJXS_DestroyDeviceHandle(handle);
KSJXS_UnInitial();
return 0;
}
示例二:回调模式取轮廓
// 回调:在 SDK 线程被调用
static void __stdcall OnProfile(void* handle, float* x, float* z,
KSJXS_PROFILE_DATA_PARAM* pParam, void* lpContext)
{
// pParam->nProfileStatus:0 正常轮廓,1 本帧最后一根,-1 无效轮廓(本帧结束)
for (int i = 0; i < pParam->nPointNum; ++i) {
if (x[i] <= -1000.0f) continue; // 无效点
// ... 处理 (x[i], z[i]) ...
}
}
// 注册 + 启动(nMode = 0,默认回调模式)
KSJXS_SetDataFormat(handle, KSJXS_DF_NON_UNIFORM);
KSJXS_RegisterProfileCB(handle, OnProfile, nullptr);
KSJXS_StartAcquisition(handle); // 等价于 nMode = 0
示例三:内触发 + 采集轮廓数配置
// 轮廓触发:内触发,按"运动速度 / 轮廓间隔"计算频率
// 物体 Y 向速度 ν = 100 mm/s,轮廓间隔 Δy = 0.05 mm
// 内触发频率 f = ν / Δy = 2000 Hz
KSJXS_SetDataTriggerMode(handle, KSJXS_DTM_INTERNAL);
KSJXS_SetDataTriggerInternalFrequency(handle, 2000.0f);
// 一次 3D 帧需采集的轮廓数 N = y / Δy(y 为物体 Y 向尺寸)
KSJXS_SetMaxNumberOfProfilesToCapture(handle, 200);
// 运动方向精度 = ν / f = 0.05 mm
KSJXS_SetYResolution(handle, 0.05f);
示例四:保存点云为 PCD
// 拥有 x / y / z 三块连续数据(长度均为 nWidth*nHeight)时
KSJXS_HelperSaveToPCD(nWidth, nHeight, pfX, pfY, pfZ, "cloud.pcd");
更多示例见 SDK 安装包 samples/ 目录。
这份文档对您有帮助吗?
发现错误、表述不清或缺少内容?请告诉我们,我们会尽快补充。
您可以通过以下方式反馈: 发送邮件至 service@catchbest.com