#camera #galaxy #gx #daheng #mer

gxi_hako

基于大恒图像GxIAPI(Galaxy Camera SDK)的Rust相机接口

3个不稳定版本

0.2.0 2024年7月15日
0.1.3 2024年7月12日
0.1.2 2024年4月27日
0.1.1 2024年4月27日
0.1.0 2024年4月26日

#118硬件支持

Download history 328/week @ 2024-04-24 28/week @ 2024-05-01 1/week @ 2024-06-05 228/week @ 2024-07-10 18/week @ 2024-07-17 7/week @ 2024-07-24

每月253次下载

MIT许可证

5.5MB
2K SLoC

包含 (Windows DLL, 1MB) src/GxIAPI.dll

crates.io version badge Documentation GitHub workflow status Minimum Stable Rust Version


alt text

已弃用

这个库基本上已经停止维护了,或者说已经被整合进了新的库之中,新的库是GXCI,它包含大恒相机SDK本地相机部分的全部原生实现,并且提供了对应的HAL封装,可以在githubcrates上查看

此项目已弃用,或已被整合到新的项目中,新项目是GXCI,可在githubcrates上查看,它包含大恒图像SDK本地相机部分的全部原生实现,并提供了HAL功能。

简介

gxi_hako是一款基于GxIAPI的Rust库,用于开发大恒工业相机的接口;

目前已实现本地相机的所有接口,枚举类型尚未完全迁移,并在utils中编写了一些工具类函数,便于使用

gxi_hako is developing the interface of Daheng Industrial Camera using Rust based on GxIAPI library;

At present, all interfaces for the local camera have been implemented, and the enums have not been completely migrated. Some utility functions have been written in utils to facilitate use.

概述

SDK开发文档包含在 ./doc/sdk 中,这里只提供SDK开发文档的英文版本,中文版本未在此提供(因为crates.io的10MB限制)。

您也可以从已安装的大恒图像SDK中获取SDK开发文档。

快速入门

以下代码与examples目录中的 list_devices_info.rs 相同


use std::mem::size_of;
use gxi_hako::{
    gx::{
        gx_interface::*, 
        gx_struct::*,
    },
    utils::{
        debug::print_device_info,
        builder::GXDeviceBaseInfoBuilder,
    },
};

fn main() {
    unsafe {
        // You can change the library path as you need
        let gx = GXInstance::new("C:\\Program Files\\Daheng Imaging\\GalaxySDK\\APIDll\\Win64\\GxIAPI.dll").expect("Failed to load library");
        gx.gx_init_lib().expect("Failed to initialize library");

        let mut device_num = 0;
        gx.gx_update_device_list(&mut device_num, 1000)
            .expect("Failed to update device list");

        if device_num > 0 {

            let mut base_info: Vec<GX_DEVICE_BASE_INFO> = (0..device_num).map(|_| {
                GXDeviceBaseInfoBuilder::new().build()
            }).collect();
            
            // or you can use the following code to initialize the vector without using the builder

            // let mut base_info = vec![
            //     GX_DEVICE_BASE_INFO {
            //         szVendorName: [0; GX_INFO_LENGTH_32_BYTE],
            //         szModelName: [0; GX_INFO_LENGTH_32_BYTE],
            //         szSN: [0; GX_INFO_LENGTH_32_BYTE],
            //         szDisplayName: [0; GX_INFO_LENGTH_128_BYTE],
            //         szDeviceID: [0; GX_INFO_LENGTH_64_BYTE],
            //         szUserID: [0; GX_INFO_LENGTH_64_BYTE],
            //         accessStatus: GX_ACCESS_STATUS_CMD::Unknown,
            //         deviceClass: GX_DEVICE_CLASS::Unknown,
            //         reserved: [0; 300],
            //     };
            //     device_num as usize
            // ];

            let mut size = (device_num as usize) * size_of::<GX_DEVICE_BASE_INFO>();
            let status = gx
                .gx_get_all_device_base_info(base_info.as_mut_ptr(), &mut size)
                .expect("Failed to get all device base info");

            if status == 0 {
                // Assuming 0 is GX_STATUS_SUCCESS
                println!(
                    "Device base info retrieved successfully. Number of devices: {}",
                    device_num
                );
                for device in &base_info {
                    print_device_info(&device);
                }

            } else {
                println!("Failed to retrieve device base info, status: {}", status);
            }
        } else {
            println!("No Devices found.");
        }

        gx.gx_close_lib().expect("Failed to close library");
        println!("Library closed.")
    }
}

用法

您可以在 gx_interface 文档中看到GXInstance部分(其中实现GXInterface trait并带有rust-doc),链接为 这里

示例

提供了5个示例,分别是:

  • list_devices_info.rs: 列出所有设备的详细信息
  • open_device_by_index.rs: 通过索引打开设备
  • open_device_by_sn.rs: 通过序列号打开设备
  • get_image.rs: 从相机获取图像
  • callback_capture.rs: 注册回调函数以实时捕获图像

您可以使用以下命令运行示例

cargo run --example list_devices_info

依赖项

OpenCV环境

这里的OpenCV库仅用于轻松提供GUI以显示图像,因此如果您不想显示图像,可以忽略此部分。

安装LLVM和OpenCV 4.9.0

在 Windows 10/11 中,我想要使用以下命令使用 choco 安装 LLVM 和 OpenCV 4.9.0

choco install llvm opencv

以下是一些网站

添加路径环境变量

您可以将以下路径添加到路径环境变量中

  • opencv 二进制路径 ...\opencv\build\bin
  • opencv x64 二进制路径 ...\opencv\build\x64\vc16\bin
  • choco 二进制路径 C:\ProgramData\chocolatey\bin
  • LLVM 二进制路径 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。

相机环境

您需要将相机连接到计算机,并确保相机已开启电源。

然后所有环境都准备好了。

相机支持

  • USB3.0 相机
    • Mer Camera (Mono8, Mono10)
  • Gige 相机

平台支持

现在,仅支持 Windows。

许可

MIT 许可协议下许可。

贡献

嗯嗯... 占位符

致谢

pLaShOlDeR~

待办事项

  • Get-Set 函数补全
  • 本地相机函数补全
  • 项目重构,等有空的时候重构
  • 基本的示例
  • 发布 crate,重构完就发布
  • 更多的示例
  • 更多的 doc 说明
  • async/await 的支持,引入 tokio
  • 补全网络相机(Gige)相关的函数
  • 补全 FeatureID 的枚举
  • Linux 平台支持
  • 更多相机类型

DLL 实现状态

  • 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 GX注销捕获回调
  • 601 35 0001E7B0 GX注销设备离线回调
  • 604 36 0001E8B0 GX注销功能回调
  • 206 37 0001BD70 GX更新所有设备列表
  • 200 38 0001BD00 GX更新设备列表
  • 703 39 0001EC40 GX写入远程设备端口
  • 711 3A 0001F450 GX写入远程设备端口堆栈 (仅限Windows)

依赖项

~4–28MB
~393K SLoC