4个版本
0.1.3 | 2024年7月12日 |
---|---|
0.1.2 | 2024年7月12日 |
0.1.1 | 2024年7月12日 |
0.1.0 | 2024年7月11日 |
#127 in 硬件支持
2.5MB
2.5K SLoC
GXCI
基于Rust的大恒工业相机GxIAPI接口开发
简介
gxci(银河相机接口)是一款基于Rust和大恒工业相机GxIAPI的库进行的接口开发;
目前已实现USB单相机的HAL库封装,raw部分包含C语言接口除去网络相机的全部内容(句柄、常量、结构、枚举、回调函数等)的直接Rust实现;HAL部分做了硬件抽象层的封装(目前包括连接、采图、推流),适合实际开发使用;utils部分则是一些工具类函数(常用的Builder模式和Facade模式函数封装);
旧版是一个名为gxi_hako的crate库,其中raw部分和utils部分不完全实现,现已暂时弃用;
新版即gxci,其中包含了raw、HAL、utils三个部分的实现;
截至目前,2024年7月11日23点45分,已经完成了features=["solo"]
部分的HAL库编写,多相机的feature尚未实现,等再次闲下来再来更新吧(๑˃ᴗ˂)ﻭ
Gxci (银河相机接口)是使用Rust基于大恒工业相机Daxi API库开发的接口;
目前,已实现USB单相机的HAL库封装,raw部分包含C语言接口除去网络相机的全部内容(句柄、常量、结构、枚举、回调函数等)的直接Rust实现;HAL部分封装了硬件抽象层(目前包括连接、采图、推流),适合实际开发使用;utils部分包含一些工具类函数(常用Builder模式和Facade模式函数封装);
旧版是一个名为gxi_hako的crate库,其中raw部分和utils部分不完全实现,现已暂时弃用;
新版即gxci,包括raw、HAL、utils三个部分的实现;
截至2024年7月11日23点45分,'features=["solo"]'部分的HAL库编写已完成,但多相机的feature尚未实现。我会再有空时更新(๑˃ᴗ˂)ﻭ。
概述
您可以从已安装的大恒影像SDK中获取sdk-dev-doc。
快速入门
- 确保您已安装OpenCV Rust绑定,
- 确保您的相机版本由GxIAPI SDK支持,并确保您已安装GxIAPI SDK。
环境配置的文档遵循快速入门部分。
在您的Cargo.toml中,添加以下依赖项
[dependencies]
gxci = {version="0.1.0", features=["solo"]}
(因为0.1.0版本Readme.md资产中没有图片,这将更轻量级lol~)
然后,您可以使用以下代码从相机获取单个图像并将其保存为png。
use gxci::hal::device::*;
use gxci::hal::basement::*;
use gxci::utils::debug::print_device_info;
fn main() {
let dll_path = "C:\\Program Files\\Daheng Imaging\\GalaxySDK\\APIDll\\Win64\\GxIAPI.dll"; // the default path of the GxIAPI.dll
gxci_init(dll_path);
let mut device_num = gxi_count_devices( 1000);
println!("Device number: {}", device_num.unwrap());
let base_info = gxi_list_devices().unwrap();
for device in &base_info {
print_device_info(&device);
}
gxi_open_device();
gxi_get_image();
gxi_save_image_as_png("test.png");
gxi_close_device();
gxci_close();
}
终端输出应如下所示
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.84s
Running `target\debug\examples\hal_get_image.exe`
Device number: 1
p_device_info: 0x1ad375f3cd0, p_buffer_size: 0xaa9f0ff8d8
Vendor Name: Daheng Imaging
Model Name: MER-132-43U3M
Serial Number: FS0170060031
Display Name: MER-132-43U3M(FS0170060031)
Device ID: MER-132-43U3M(FS0170060031)
User ID:
Access Status: GX_ACCESS_STATUS_UNKNOWN
Device Class: GX_DEVICE_CLASS_U3V
-----------------------
Device handle: Some(0x1ad3738f3e0)
Successfully opened device index 1
Successfully sent command
int_value: 0xaa9f0ff250
int_value: 0xaa9f0ff258
enum_value: 0xaa9f0ff270
enum_value: 0xaa9f0ff260
int_value: 0xaa9f0ff268
p_frame_data: 0xaa9f0ff6f8
frame_data: GX_FRAME_DATA { nStatus: 0, pImgBuf: 0x1ad39635040, nWidth: 1292, nHeight: 964, nPixelFormat: 17301505, nImgSize: 9963904, nFrameID: 0, nTimestamp: 0, reserved: [17301505] }
Frame data: GX_FRAME_DATA { nStatus: 0, pImgBuf: 0x1ad39635040, nWidth: 1292, nHeight: 964, nPixelFormat: 17301505, nImgSize: 1245488, nFrameID: 0, nTimestamp: 61947717921575, reserved: [17301505] }
Successfully sent command
Successfully got image
Image saved successfully.
Device handle: Some(0x0)
Successfully closed device
如果您的相机如下所示
那么您将得到一个test.png
更多代码请查看示例。
示例
这里提供了5个原始示例和3个HAL示例,它们是
- 原始示例
- raw_open_device_by_index
- raw_open_device_by_sn
- raw_list_device_info
- raw_get_image
- raw_capture_callback
- HAL示例
- hal_list_device_info
- hal_get_image
- hal_capture_callback
您可以像这样运行它们
cargo run --example hal_list_device_info
依赖项
OpenCV环境
这里的OpenCV库用于轻松地图像matlization并提供一个GUI来显示图像。
无论如何,我认为OpenCV是图像处理区域中必要的库。
但是缺点是OpenCV有点重,我正在尝试找到一个更轻的库来替换它,比如no-opencv
。但这也需要时间。
(现在最新的OpenCV是4.10.0,但我还没有尝试过。所以这里是一个4.9.0教程)
安装LLVM和OpenCV 4.9.0
在Windows 10/11上,我想使用以下命令安装LLVM和OpenCV 4.9.0
choco install llvm opencv
以下是一些网站
添加路径环境变量
您可以将以下路径添加到路径环境变量中
- opencv bin路径 ...\opencv\build\bin
- opencv x64 bin路径 ...\opencv\build\x64\vc16\bin
- choco bin路径 C:\ProgramData\chocolatey\bin
- LLVM bin路径 C:\Program Files\LLVM\bin
以下是一个示例
D:\ProgramUnsigned\Embedded\opencv\build\bin
D:\ProgramUnsigned\Embedded\opencv\build\x64\vc16\bin
C:\ProgramData\chocolatey\bin
C:\Program Files\LLVM\bin
添加opencv环境变量(系统变量)
OPENCV_INCLUDE_PATHS ...\opencv\build\include OPENCV_LINK_LIBS opencv_world490 OPENCV_LINK_PATHS ...\opencv\build\x64\vc16\lib
以下是一个示例
OPENCV_INCLUDE_PATHS D:\ProgramUnsigned\Embedded\opencv\build\include
OPENCV_LINK_LIBS opencv_world490
OPENCV_LINK_PATHS D:\ProgramUnsigned\Embedded\opencv\build\x64\vc16\lib
将opencv_world490.dll复制到目标目录(如果需要的话)
有时,您需要将opencv_world490.dll复制到目标目录,它与exe文件相同。
GxIAPI环境
您还需要安装GxIAPI SDK,可以从官方网站下载。
只需安装适用于您的平台的SDK。
相机环境
您需要将相机连接到您的计算机的USB端口,并确保相机已开启电源。
然后所有环境都已准备就绪。
相机支持
- USB3.0相机
- Mer相机(Mono8,Mono10)
- Gige相机
平台支持
目前,仅支持Windows。
许可
根据MIT许可证授权。
贡献
嗯嗯...占位符,我认为我将在这部分时间独自完成。
如果您有任何问题,请提出问题。
其他方式您可以通过电子邮件联系我:[email protected];
或通过腾讯QQ:2212540603(在好友请求中提供相关信息)
致谢
感谢MoonWX同学的建议,将GXCI(GalaXy Camera Interface)的命名改为简洁明确且非常酷的名字ヽ(・∀・)ノ;
还要感谢同专业的李同学的帮助,在gx_enum的长类型转换中,我们协力在十分钟内完成了C枚举到Rust枚举的转换( ̄ω ̄);
还要感谢OpenAI的GPT模型DELTA·E绘制的炫酷LOGO :D
GXCI(GalaXy Camera Interface)的命名感谢MoonWX同学的建议,这是一个简洁明确并且非常酷的名字ヽ(・∀・)ノ;
另外,我想对同专业的李同学表示感谢,在gx-enum的冗长类型转换过程中,我们协力在十分钟内完成了从C枚举到Rust枚举的转换( ̄ω ̄);
再次感谢OpenAI的GPT模型DELTA · E为创建一个酷炫的LOGO :D
待办事项列表
- 多相机功能
- 无-opencv功能
- 补充网络相机(Gige)相关的函数
HAL函数实现状态
- 基础
- gxi_check()
- gxci_init()
- gxci_close()
- 设备
- gxi_count_devices()
- gxi_list_devices()
- gxci_open_device() // 独特功能
- gxci_close_device() // 单独功能
- gxi_send_command() // 单独功能
- gxi_get_image() // 单独功能
- gxi_open_stream() // 单独功能
- gxi_open_stream_interval() // 单独功能
- gxi_close_stream() // 单独功能
- 配置
- 待办!()
- 事件
- 待办!()
- 网络
- 待办!()
DLL RAW实现状态
- 302 0 0001C020 GXCloseDevice
- 101 1 0001BBC0 GXCloseLib
- 700 2 0001E9E0 GXExportConfigFile
- 707 3 0001EA50 GXExportConfigFileW ?在开发文档里面没介绍这个函数
- 602 4 0001E920 GXFlushEvent
- 505 5 0001E6E0 GXFlushQueue
- 201 6 0001BDE0 GXGetAllDeviceBaseInfo
- 414 7 0001D5F0 GXGetBool
- 419 8 0001E080 GXGetBuffer
- 418 9 0001DF50 GXGetBufferLength
- 205 A 0001BE80 GXGetDeviceIPInfo
- 423 B 0001C0B0 GXGetDevicePersistentIpAddress
- 411 C 0001D3C0 GXGetEnum
- 410 D 0001CF50 GXGetEnumDescription
- 409 E 0001CE20 GXGetEnumEntryNums
- 506 F 0001E970 GXGetEventNumInQueue
- 422 10 0001C1E0 GXGetFeatureName
- 408 11 0001CCF0 GXGetFloat
- 406 12 0001C960 GXGetFloatRange
- 504 13 0001E670 GXGetImage
- 404 14 0001C730 GXGetInt
- 403 15 0001C590 GXGetIntRange
- 204 16 0001BC40 GXGetLastError
- 709 17 0001F370 GXGetOptimalPacketSize (Windows Only)
- 416 18 0001DAA0 GXGetString
- 415 19 0001D820 GXGetStringLength
- 425 1A 0001D970 GXGetStringMaxLength
- 705 1B 0001EEF0 GXGigEForceIp
- 704 1C 0001ECC0 GXGigEIpConfiguration
- 706 1D 0001F170 GXGigEResetDevice
- 701 1E 0001EAC0 GXImportConfigFile
- 708 1F 0001EB40 GXImportConfigFileW ?在开发文档里面没介绍这个函数
- 100 20 0001BB70 GXInitLib
- 400 21 0001C260 GXIsImplemented
- 401 22 0001C370 GXIsReadable
- 402 23 0001C480 GXIsWritable
- 301 24 0001BFB0 GXOpenDevice
- 300 25 0001BF10 GXOpenDeviceByIndex
- 702 26 0001EBC0 GXReadRemoteDevicePort
- 710 27 0001F3E0 GXReadRemoteDevicePortStacked
- 500 28 0001E5B0 GXRegisterCaptureCallback
- 600 29 0001E730 GXRegisterDeviceOfflineCallback
- 603 2A 0001E820 GXRegisterFeatureCallback
- 421 2B 0001E480 GXSendCommand
- 507 2C 0001F100 GXSetAcqusitionBufferNumber
- 413 2D 0001D720 GXSetBool
- 420 2E 0001E350 GXSetBuffer
- 424 2F 0001C160 GXSetDevicePersistentIpAddress
- 412 30 0001D4F0 GXSetEnum
- 407 31 0001CBE0 GXSetFloat
- 405 32 0001C860 GXSetInt
- 417 33 0001DDC0 GXSetString
- 501 34 0001E620 GXUnregisterCaptureCallback
- 601 35 0001E7B0 GXUnregisterDeviceOfflineCallback
- 604 36 0001E8B0 GXUnregisterFeatureCallback
- 206 37 0001BD70 GXUpdateAllDeviceList
- 200 38 0001BD00 GXUpdateDeviceList
- 703 39 0001EC40 GXWriteRemoteDevicePort
- 711 3A 0001F450 GXWriteRemoteDevicePortStacked (Windows Only)
依赖项
~4–28MB
~393K SLoC