KSJAPI SDK 示例代码
基于真实接口的最小可用示例:枚举打开、采集存盘、回调预览、软触发与外触发配置。
以下示例使用头文件中的真实接口名,注意成功返回码为
RET_SUCCESS(=1)。
示例一:枚举相机并采集一帧保存为 BMP
#include "KSJApi.h"
#include <cstdio>
#include <vector>
int main()
{
// 1) 初始化(前置条件:相机已连接主机)
if (KSJ_Init() != RET_SUCCESS) {
printf("KSJ_Init 失败\n");
return -1;
}
// 2) 枚举相机
int nCount = KSJ_DeviceGetCount();
if (nCount <= 0) {
printf("未找到相机\n");
KSJ_UnInit();
return -1;
}
KSJ_DEVICETYPE deviceType = KSJ_UC130C_MRNN;
int serial = 0;
unsigned short fwVersion = 0;
KSJ_DeviceGetInformation(0, &deviceType, &serial, &fwVersion);
// 3) 打开设备(多进程场景必须)
KSJ_DeviceOpen(0);
// 4) 配置采集视场(不调用则用默认最大视场)
int colStart = 0, rowStart = 0, colSize = 0, rowSize = 0;
KSJ_ADDRESSMODE amCol = KSJ_SKIPNONE, amRow = KSJ_SKIPNONE;
KSJ_CaptureGetDefaultFieldOfView(0, &colStart, &rowStart, &colSize, &rowSize, &amCol, &amRow);
// KSJ_CaptureSetFieldOfView(0, colStart, rowStart, colSize, rowSize, KSJ_SKIPNONE, KSJ_SKIPNONE);
// 5) 设置曝光与超时
KSJ_ExposureTimeSet(0, 5.0f); // 单位 ms
KSJ_CaptureSetTimeOut(0, 3000); // 单位 ms
// 6) 读取实际图像尺寸(宽 * 高 * 位深/8 为缓冲区大小)
int w = 0, h = 0, bitCount = 0;
KSJ_CaptureGetSizeEx(0, &w, &h, &bitCount);
std::vector<unsigned char> buffer((size_t)w * h * bitCount / 8);
// 7) 主动采集一帧(阻塞)
int ret = KSJ_CaptureRgbData(0, buffer.data());
if (ret == RET_SUCCESS) {
KSJ_HelperSaveToBmp(buffer.data(), w, h, bitCount, TEXT("capture.bmp"));
} else {
printf("采集失败,错误码 %d\n", ret);
}
// 8) 收尾
KSJ_DeviceClose(0);
KSJ_UnInit();
return 0;
}
示例二:预览 + 回调取实时图像
#include "KSJApi.h"
#include <cstdio>
// 预览回调:pImageData 为已转换好的图像数据
static void __stdcall OnPreview(unsigned char* pImageData, int nWidth, int nHeight, int nBitCount, void* lpContext)
{
// 注意:此回调运行在 SDK 线程,切勿在此做耗时操作或直接操作 UI
// 可将数据拷贝后投递到主线程处理
}
int main()
{
KSJ_Init();
if (KSJ_DeviceGetCount() <= 0) { KSJ_UnInit(); return -1; }
KSJ_DeviceOpen(0);
// 必须先设置预览窗口位置,再启动预览
HWND hWnd = /* 你的显示窗口句柄 */ nullptr;
KSJ_PreviewSetPos(0, hWnd, 0, 0, 640, 480);
// 注册回调(可选,用于拿到图像数据副本)
KSJ_PreviewSetCallback(0, OnPreview, nullptr);
KSJ_PreviewStart(0, true); // 开启视频流
// ... 运行若干秒 ...
KSJ_PreviewStart(0, false); // 停止视频流
KSJ_DeviceClose(0);
KSJ_UnInit();
return 0;
}
示例三:软触发采集
// 触发模式设为软触发:每次 Capture 才会采集一帧
KSJ_TriggerModeSet(0, KSJ_TRIGGER_SOFTWARE);
// 此时 KSJ_CaptureRgbData 会主动触发相机采集并上传一帧
int w = 0, h = 0, bit = 0;
KSJ_CaptureGetSizeEx(0, &w, &h, &bit);
// ... 分配缓冲区后调用 KSJ_CaptureRgbData(0, pBuf) ...
示例四:外触发 + 读取相机缓存状态
// 外触发模式:收到外部信号才采集
KSJ_TriggerModeSet(0, KSJ_TRIGGER_EXTERNAL);
KSJ_TriggerMethodSet(0, KSJ_TRIGGER_RISINGEDGE); // 上升沿触发
KSJ_TriggerDelaySet(0, 0); // 触发延时(×100us)
// 外触发下超时时间应大于触发信号最大间隔
KSJ_CaptureSetTimeOut(0, 5000);
// 采集前可先查相机缓存是否有数据可读
KSJ_TRIGGERSTATUS st = KSJ_NO;
KSJ_TriggerStatusGet(0, &st);
if (st == KSJ_HAVE) {
// 缓存中有帧,可直接读取
}
更多示例与说明见开发包
Samples/目录及《凯视佳工业相机开发示例说明书》。
这份文档对您有帮助吗?
发现错误、表述不清或缺少内容?请告诉我们,我们会尽快补充。
您可以通过以下方式反馈: 发送邮件至 service@catchbest.com