hik-mvcamera-control

围绕海康机器人 机器视觉 SDK 的本地封装与工程骨架:仓库已包含 读码器(MvCodeReader) 与 工业相机(MvCamera) 两套 SDK 的头文件与导入库,src/code_reader/ 与 src/mvcamera/ 各是一套 C++ 封装(设备枚举、开关流、网络与参数设置等),并带有基于 GoogleTest 的 CMake 测试目标。对外提供 稳定 C ABI(hik_cr_* / hik_cv_*),便于 Python(ctypes)、Go(cgo) 与 Node(N-API,统一包 ffi/node → hik-mvcamera-control) 等语言加载 hik_code_reader.dll / hik_mvcamera.dll 共享库调用。

main README 变更后自动刷新;pip 索引在发版时更新。

读码器 C++ 封装

设备枚举、开停流、GigE 改 IP、GenICam 写参与读码回调;面向客户端进程内集成。

稳定 C ABI

hik_cr_* 与线程局部错误信息,便于 ctypes / cgo 等 FFI 安全调用。

Python & Go

正式包 hik-code-reader(wheel 内嵌 DLL);Go 子模块在 ffi/go

分发方式

Release 附件 + 本站的 PEP 503 索引;Go 使用 go getffi/go/v* 标签。

快速安装(示例)

以下为典型写法;版本号与 tag 对应,请以 Releases 与 README 为准。当前平台主要为 Windows x64

Python(PEP 503)

pip install "hik-code-reader==<版本>" \
  --index-url "https://snippet0809.github.io/hik-mvcamera-control/simple/" \
  --trusted-host "snippet0809.github.io"

Go

go get github.com/snippet0809/hik-mvcamera-control/ffi/go@<tag 或 main>

完整说明(README)

以下内容由仓库根目录 README.md 自动生成;更新 README 并推送到默认分支后,由 Pages (README) 工作流刷新本页。

围绕海康机器人 机器视觉 SDK 的本地封装与工程骨架:仓库已包含 读码器(MvCodeReader)工业相机(MvCamera) 两套 SDK 的头文件与导入库,src/code_reader/src/mvcamera/ 各是一套 C++ 封装(设备枚举、开关流、网络与参数设置等),并带有基于 GoogleTest 的 CMake 测试目标。对外提供 稳定 C ABIhik_cr_* / hik_cv_*),便于 Python(ctypes)Go(cgo)Node(N-API,统一包 ffi/nodehik-mvcamera-control 等语言加载 hik_code_reader.dll / hik_mvcamera.dll 共享库调用。

项目架构(分层与自动化)

运行时与代码分层

自底向上:厂商 SDKinclude/lib/ 中海康头文件与导入库)→ src/code_reader/ / src/mvcamera/ C++ 封装(设备、参数、回调等)→ 导出 DLL hik_code_reader.dllhik_cr_*)/ hik_mvcamera.dllhik_cv_*)→ 上层语言通过 FFI 加载 DLL:

flowchart TB
  SDK["海康机器视觉 SDK\nMvCodeReader + MvCamera\n头文件 / .lib"]
  CPPR["C++ 封装\nsrc/code_reader/"]
  CPPM["C++ 封装\nsrc/mvcamera/"]
  CAPI["C ABI\nhik_cr_* / hik_cv_*"]
  DLLR["hik_code_reader.dll"]
  DLLM["hik_mvcamera.dll"]
  PY["python/hik_code_reader\n正式 wheel(读码器)"]
  G["ffi/go/hikcr\ncgo(读码器)"]
  PYref["ffi/python\nctypes 参考(读码器)"]
  NODE["ffi/node\nhik-mvcamera-control\n(读码器 + 相机)"]
  SDK --> CPPR --> CAPI --> DLLR
  SDK --> CPPM --> CAPI --> DLLM
  DLLR --> PY
  DLLR --> G
  DLLR -.-> PYref
  DLLR --> NODE
  DLLM --> NODE

GitHub Actions 在流程中的位置

环节 Workflow 作用(简述)
发版 release.yml 打 tag v* → 同步 pyproject 版本、构建产物、GitHub Release、gh-pages(含 PEP 503 + 主页)、ffi/go/v* 标签。
文档页增量 pages-readme.yml main/masterREADME.github/scripts/ 变更时,重生成 主页 index.html,保留已有 simple/

站点生成脚本的模块关系、环境变量与两种模式说明见 .github/scripts/README.md(与根 README 互补:根文档讲「产品」,该文件讲「Pages 构建脚本怎么拼在一起」)。

功能概览(读码器 C++ 封装)

在 GitHub 上托管分发(维护者)

GitHub Packages 没有与 PyPI 对等的 Python 包仓,也没有替代 go get 的独立 Go Registry。本仓库采用 「Releases + GitHub Pages(PEP 503)+ Git 标签」,全部留在 GitHub 上完成托管。

原理简述

对象 托管位置 作用
Python wheel GitHub Releases 附件 真实安装包;pip 最终下载的文件
pip search 式索引 GitHub Pagesgh-pages 分支的 simple/ 符合 PEP 503,让开发者能用 pip install 包名==版本 --index-url ...
Go 源码模块 本仓库 Git + 标签 ffi/go/vX.Y.Z go get 经官方模块代理从 GitHub 拉取

维护者一次性配置

  1. 保证 ffi/go/go.mod 第一行与 GitHub 仓库路径一致。本仓库应为:
    module github.com/snippet0809/hik-mvcamera-control/ffi/go
    (若 fork 后自用,请改为 github.com/<你的用户名>/hik-mvcamera-control/ffi/go。)
  2. 在 GitHub 打开本仓库:Settings → Pages
  3. Build and deployment:Source 选 Deploy from a branch
  4. Branch 选 gh-pages,文件夹选 /(root)
  5. 保存。首次需等 release.yml 成功跑过一次 后才有 gh-pages 分支。

维护者发版步骤

  1. 在默认分支上确认代码与 python/pyproject.toml 已就绪。
  2. 创建并推送 语义化标签(必须以 v 开头):
    git tag v0.0.2 && git push origin v0.0.2
  3. GitHub ActionsRelease 工作流(release.yml)会自动:
  4. python/pyproject.toml 里的 version 改成与标签一致(去掉 v,如 v0.0.20.0.2),再构建 Windows x64 wheel_native/ 内含 hik_code_reader.dll 与海康 MvCodeReaderCtrl.lib / turbojpeg.lib);
  5. 创建/更新 GitHub Release,并上传 wheel、Go/cgo 用 zip(含 lib/MvCodeReader/win64)、hik_code_reader.dllhik_code_reader.lib 及上述厂商 .lib
  6. 生成 PEP 503 页面并推送到 gh-pages(与已有索引合并,保留历史版本链接);
  7. 在同一提交上自动创建 ffi/go/v0.0.2 标签(若不存在),供 go get 使用。

发版后维护者自检


开发者使用指南

以下示例以本仓库 github.com/snippet0809/hik-mvcamera-control 为准;若你 fork 或改名,请替换路径中的用户名与仓库名。

Python 开发者

环境:当前 wheel 为 Windows x64(文件名中含 win_amd64),需在对应环境安装。

方式 A:从 GitHub Release 直链安装 wheel(不依赖 Pages,最省事)

  1. 打开本仓库 Releases,选择对应版本(如 v0.0.2)。
  2. Assets 里找到 hik_code_reader-…-py3-none-win_amd64.whl,复制其「直链」;或直接使用与 tag、版本一致的 URL(tag 带 v,包版本号无 v):
pip install "https://github.com/snippet0809/hik-mvcamera-control/releases/download/v0.0.2/hik_code_reader-0.0.2-py3-none-win_amd64.whl"

其它版本请把 URL 中的 v0.0.2 / 0.0.2 换成你的 tag 与 pyproject 版本;wheel 完整文件名以该 Release 页 Assets 为准

方式 B:像「私有 PyPI 源」一样用 PEP 503(依赖 Pages)
在维护者已开启 GitHub Pagesgh-pages)且发过版的前提下:

pip install "hik-code-reader==0.0.2" \
  --index-url "https://snippet0809.github.io/hik-mvcamera-control/simple/" \
  --trusted-host "snippet0809.github.io"

代码示例

from hik_code_reader import HikCodeReader

cr = HikCodeReader()  # wheel 内有 hik_code_reader.dll;MvCodeReaderCtrl 等 DLL 由本机 Runtime 或你方部署方式提供
print(cr.enum_devices())

pip 安装后提示找不到 DLL / WinError 126 / 0xc0000135

Go 开发者

模块路径(须与仓库 go.mod 一致):

github.com/snippet0809/hik-mvcamera-control/ffi/go

安装指定版本(与已发布的 vX.Y.Z / 自动打的 ffi/go/vX.Y.Z 一致):

go get github.com/snippet0809/hik-mvcamera-control/ffi/go@v0.0.2

代码中导入

import "github.com/snippet0809/hik-mvcamera-control/ffi/go/hikcr"

说明

GitHub Actions 摘要

Workflow 说明
Release.github/workflows/release.yml 推送 v*.*.*GitHub Release 附件、gh-pages(更新 pipsimple/ 与根目录 README 页)、自动 ffi/go/v* 标签。
Pages (README).github/workflows/pages-readme.yml 推送到 main/master 且变更 README.md.github/scripts/ 下站点生成脚本时:只重部署 index.html(入口为 generate_pages_site.py),keep_files 保留 simple/

仓库结构

路径 说明
src/code_reader/ 读码器 C++ 封装实现(code_reader.hc_api.cpp 等)
include/hik_code_reader/ C ABI 头文件c_api.h),供 Python/Go 等包含
python/ hik-code-reader 包与 pyproject.toml(wheel 的 _native/ 含 DLL 与海康 win64 导入库)
ffi/python/ ctypes 参考实现(与 python/hik_code_reader 保持同步为佳)
ffi/go/ Go 子模块(go.mod);包目录 hikcr
ffi/node/ 统一 npm 包 hik-mvcamera-control(node-addon-api):单插件同时导出读码器(HikCodeReader)与相机(HikCamera);预编译 .node + 读码器/相机运行时全捆绑
include/MvCamera/include/MvCodeReader/ 海康 SDK 头文件
lib/MvCamera/{win32,win64}/lib/MvCodeReader/{win32,win64}/ 预置静态库(含 turbojpeg 等读码器依赖)
tests/ GTest 用例(需连接真实设备时谨慎运行)
.docs/ 本地文档(如读码器开发指南 CHM)

构建要求

构建与测试

cmake -S . -B build -G "Visual Studio 17 2022" -A x64
cmake --build build --config Release
ctest --test-dir build -C Release

无 VS2022 生成器时可用 Ninja(需已安装 Ninja 且在同一 shell 中加载 MSVC 环境,产物为 build/hik_code_reader.dll):

cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build build

首次配置会从网络下载 GTest;需保证构建环境可访问 GitHub。

产物说明:

运行与部署说明

  1. 在目标机器安装海康读码器/视觉设备所需 驱动与运行库(版本需与 SDK 匹配)。
  2. GigE 设备注意网卡、防火墙与网段;改 IP 请使用海康官方工具/SDK,本仓库封装不再提供 setIp
  3. 将 SDK 提供的 DLL(若静态链仍依赖运行时)放在可执行文件同目录或系统 PATH 中,按官方文档为准。

读码器 SDK 使用要点(与 .docs 开发指南 CHM 一致)

以下摘要自海康读码器 SDK 开发指南,使用本封装或直连 MvCodeReader 前请一并遵守:

  1. GigE 网口巨帧:使用前需先在网卡上开启 巨帧(Jumbo Frame),否则大包/高负载下易丢包或异常。
  2. RunTime 包:需安装与目标程序 位数一致(32 位 / 64 位)的 工业相机 SDK RunTime,且版本为 RunTime 3.0.0 及以上
  3. 回调与轮询互斥回调类接口轮询类接口不能同时用来取图;二者二选一,不可混用。
  4. 多路回调:对指定流通道调用底层 MV_CODEREADER_MSC_RegisterImageCallBack() 可注册回调;可对多路流通道分别注册,以同时获取多路图像与条码结果。
  5. 多路轮询MV_CODEREADER_MSC_GetOneFrameTimeout() 可按通道轮询取图;可对多路流通道分别轮询,以同时获取多路数据。

本仓库 C++ 封装在取流路径上主要采用 回调 模式(如 BCR 回调);若你在同进程内再调官方 轮询 接口,须遵守上述互斥约定。更细的参数与流程以 CHM / 官方 PDF 为准。

Windows:RunTime 位置与「环境变量」说明

海康 MVS / IDMVS / RunTime 安装器一般会同时:

python/hik_code_reader 在 Windows 上会读取上述 路径型官方变量Path 中的 MVS/IDMVS 相关目录,用于 os.add_dll_directory(见包内实现)。仍仅保留本仓库自有的 HIK_CODE_READER_DLL(仅指向 hik_code_reader.dll 本身,可选)。

自查 PATH 里与厂商相关的项(PowerShell,合并用户级与机器级):

('Machine','User') | ForEach-Object {
  [Environment]::GetEnvironmentVariable('Path', $_) -split ';' |
    Where-Object { $_ -match '(?i)MVS|MvCode|IDMVS|Hik|HIKROBOT|Runtime|Common Files\\MVS' }
} | Sort-Object -Unique

自查海康常见路径型环境变量(当前进程继承的安装器配置):

'GENICAM_GENTL64_PATH','GENICAM_GENTL32_PATH','MVCAM_GENICAM_CLPROTOCOL' | ForEach-Object {
  "${_}=$([Environment]::GetEnvironmentVariable($_,'Process'))"
}

常见会出现的路径形态(仅供参考,以你机器上安装版本为准):

若进程仍报 找不到 DLL / 0xc0000135:除检查 PATH 外,还可把缺失的 DLL 放到 hik_code_reader.dll 同目录,或确认与 RunTime 3.0.0+x64/x86 位数 一致。

许可证与第三方

海康威视 MvCamera / MvCodeReader SDK 及其文档的版权与许可归原著作权人所有;本仓库中的封装代码请以你方项目许可证为准。GoogleTest 遵循其开源协议(由 CMake FetchContent 获取)。

相关文档