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