KSJAPI SDK 示例代码

版本 1.0 · 更新于 2026-10-21 · 阅读 0

基于真实接口的最小可用示例:枚举打开、采集存盘、回调预览、软触发与外触发配置。

以下示例使用头文件中的真实接口名,注意成功返回码为 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/ 目录及《凯视佳工业相机开发示例说明书》。