2025-12-10 00:01:32 +08:00

285 lines
7.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 <atomic>
std::atomic<int> 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) - 初始版本
- 支持基本的相机操作
- 支持单张和连续采集
- 支持常用参数设置
## 许可
遵循项目整体许可协议
## 联系方式
如有问题请联系项目维护者