#camera #hal #galaxy #abstraction-layer #interface #content #daheng

gxci

基于大恒影像GxIAPI(银河相机SDK)的原始和HAL相机接口

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 硬件支持

MIT许可证

2.5MB
2.5K SLoC

logo

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。

快速入门

  1. 确保您已安装OpenCV Rust绑定,
  2. 确保您的相机版本由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

如果您的相机如下所示

alt text

那么您将得到一个test.png

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