# IKapDevice 封装库 ## 简介 IKapDevice 是对 IKapLibrary C 接口的 C++ 封装库,提供了简洁易用的相机操作接口。主要用于获取单张图像和连续采集。 ## 目录结构 ``` IKapDevice/ ├── Inc/ # 公共头文件目录 │ ├── IIKapDevice.h # 接口类定义 │ └── IKapDevice_global.h # 全局宏定义 ├── _Inc/ # 内部头文件目录 │ └── IKapDevice.h # 实现类定义 ├── Src/ # 源文件目录 │ └── IKapDevice.cpp # 实现类源文件 ├── IKapDevice.pro # qmake 工程文件 └── README.md # 说明文档 ``` ## 特性 - ✅ 支持相机枚举和设备信息查询 - ✅ 支持单张图像采集(同步模式) - ✅ 支持连续图像采集(异步模式,回调函数) - ✅ 支持常用相机参数设置(曝光、增益、触发模式等) - ✅ 支持 ROI 设置 - ✅ 线程安全设计 - ✅ 跨平台支持(Windows x64 / Linux ARM) ## 接口设计 ### 核心接口 ```cpp class IIKapDevice { public: // 创建设备对象 static int CreateObject(IIKapDevice** ppDevice); // 库初始化/释放 virtual int InitLibrary() = 0; virtual int TerminateLibrary() = 0; // 枚举设备 virtual int EnumerateDevices(unsigned int& nCount) = 0; virtual int GetDeviceInfo(unsigned int nIndex, IKapDeviceInfo& deviceInfo) = 0; // 打开/关闭设备 virtual int OpenDevice(unsigned int nIndex, int accessMode = 4) = 0; virtual int CloseDevice() = 0; // 采集图像 virtual int GrabSingleFrame(ImageData& imageData, unsigned int nTimeout = 5000) = 0; virtual int StartGrabbing(ImageCallback callback, void* pUser = nullptr) = 0; virtual int StopGrabbing() = 0; // 参数设置 virtual int SetExposureTime(double exposureTime) = 0; virtual int GetExposureTime(double& exposureTime) = 0; virtual int SetGain(double gain) = 0; virtual int GetGain(double& gain) = 0; // ... 其他接口 }; ``` ## 使用示例 ### 示例 1: 获取单张图像 ```cpp #include "IIKapDevice.h" int main() { // 1. 创建设备对象 IIKapDevice* pDevice = nullptr; if (IIKapDevice::CreateObject(&pDevice) != 0) { std::cerr << "创建设备对象失败" << std::endl; return -1; } // 2. 初始化库 if (pDevice->InitLibrary() != 0) { std::cerr << "初始化库失败" << std::endl; delete pDevice; return -1; } // 3. 枚举设备 unsigned int deviceCount = 0; if (pDevice->EnumerateDevices(deviceCount) != 0 || deviceCount == 0) { std::cerr << "未找到相机设备" << std::endl; pDevice->TerminateLibrary(); delete pDevice; return -1; } std::cout << "找到 " << deviceCount << " 个相机" << std::endl; // 4. 获取设备信息 IKapDeviceInfo devInfo; pDevice->GetDeviceInfo(0, devInfo); std::cout << "设备型号: " << devInfo.modelName << std::endl; std::cout << "序列号: " << devInfo.serialNumber << std::endl; // 5. 打开设备(索引 0,独占模式) if (pDevice->OpenDevice(0, 4) != 0) { std::cerr << "打开设备失败" << std::endl; pDevice->TerminateLibrary(); delete pDevice; return -1; } // 6. 设置相机参数 pDevice->SetExposureTime(10000.0); // 曝光时间 10ms pDevice->SetGain(5.0); // 增益 5dB // 7. 获取单张图像 ImageData imageData; imageData.pData = nullptr; if (pDevice->GrabSingleFrame(imageData, 5000) == 0) { std::cout << "成功采集图像" << std::endl; std::cout << " 宽度: " << imageData.width << std::endl; std::cout << " 高度: " << imageData.height << std::endl; std::cout << " 大小: " << imageData.imageSize << " 字节" << std::endl; // 使用图像数据... // cv::Mat image(imageData.height, imageData.width, CV_8UC1, imageData.pData); // cv::imwrite("image.bmp", image); // 释放图像数据 if (imageData.pData != nullptr) { delete[] imageData.pData; } } // 8. 清理资源 pDevice->CloseDevice(); pDevice->TerminateLibrary(); delete pDevice; return 0; } ``` ### 示例 2: 连续采集图像 ```cpp #include "IIKapDevice.h" #include std::atomic g_frameCount(0); // 图像回调函数 void OnImageReceived(const ImageData& imageData, void* pUser) { g_frameCount++; std::cout << "收到第 " << g_frameCount << " 帧图像, " << "大小: " << imageData.width << "x" << imageData.height << std::endl; // 处理图像数据... } int main() { IIKapDevice* pDevice = nullptr; IIKapDevice::CreateObject(&pDevice); pDevice->InitLibrary(); unsigned int deviceCount = 0; pDevice->EnumerateDevices(deviceCount); if (deviceCount > 0) { pDevice->OpenDevice(0); // 设置参数 pDevice->SetExposureTime(10000.0); pDevice->SetGain(5.0); // 开始连续采集 std::cout << "开始连续采集..." << std::endl; pDevice->StartGrabbing(OnImageReceived, nullptr); // 采集 10 秒 std::this_thread::sleep_for(std::chrono::seconds(10)); // 停止采集 pDevice->StopGrabbing(); std::cout << "停止采集,共采集 " << g_frameCount << " 帧" << std::endl; pDevice->CloseDevice(); } pDevice->TerminateLibrary(); delete pDevice; return 0; } ``` ## 编译 ### Windows (MSVC) ```bash qmake IKapDevice.pro nmake ``` ### Linux (ARM) ```bash qmake IKapDevice.pro make ``` ## 链接到你的项目 在你的 .pro 文件中添加: ```qmake # 头文件路径 INCLUDEPATH += $$PWD/../../Device/IKapDevice/Inc # 库链接 win32:CONFIG(debug, debug|release) { LIBS += -L$$PWD/../../Device/IKapDevice/debug -lIKapDevice } win32:CONFIG(release, debug|release) { LIBS += -L$$PWD/../../Device/IKapDevice/release -lIKapDevice } unix:!macx { LIBS += -L$$PWD/../../Device/IKapDevice -lIKapDevice } ``` ## 注意事项 1. **线程安全**: 单个设备对象不支持多线程同时调用,建议在单一线程中操作 2. **资源释放**: 使用 `GrabSingleFrame` 或回调函数获取的图像数据需要手动释放内存 3. **访问模式**: - `4` - 独占模式(ITKDEV_VAL_ACCESS_MODE_EXCLUSIVE)- 推荐 - `1` - 监控模式(ITKDEV_VAL_ACCESS_MODE_MONITOR) - `2` - 控制模式(ITKDEV_VAL_ACCESS_MODE_CONTROL) - `3` - 流模式(ITKDEV_VAL_ACCESS_MODE_STREAM) 4. **参数设置**: 不同相机型号支持的参数可能不同,设置前建议查阅相机手册 ## 与 VrEyeDevice 的区别 | 特性 | VrEyeDevice | IKapDevice | |------|-------------|------------| | SDK | VzNLSDK (3D激光相机) | IKapLibrary (通用工业相机) | | 主要功能 | 3D点云数据采集 | 2D图像采集 | | 特殊功能 | RGBD、摆动机构、激光检测 | 触发模式、ROI、通用相机参数 | | 数据格式 | 点云 + 2D图像 | 2D图像 | | 接口风格 | 类似(继承自相同的架构模式) | 类似(继承自相同的架构模式) | ## 版本历史 - v1.0.0 (2025-01-XX) - 初始版本 - 支持基本的相机操作 - 支持单张和连续采集 - 支持常用参数设置 ## 许可 遵循项目整体许可协议 ## 联系方式 如有问题请联系项目维护者