(buildroot环境)移植numpy,opencv-python库分享
压缩numpy,opencv-python,visiong库大小,降低内存需求,内存有限的G2版本依旧建议使用低分辨率;
使用:
1.将附件中的numpy_cv2_visiong.zip中的内容解压到/usr/lib/python3.11/site-packages/即可(注意剩余空间是否满足所需)
2.联合使用示例可见压缩包内的test.py文件,旧的演示视频:https://www.bilibili.com/video/BV1HdeEz4EYU
说明:
1.移植的numpy的版本是1.24.3,为了实现对 uclibc 环境的兼容,禁用了部分依赖,裁剪了部分功能;
2.移植的opencv-python版本是4.12.0,基于nihui大佬的opencv-mobile(https://github.com/nihui/opencv-mobile)重新添加python绑定,编译过程中,由于涉及highgui的部分老是报错,又因为visiong库已经实现了获取图像的功能,就直接省去highgui相关内容了;
3.visiong库源于我此前的项目,https://oshwhub.com/salieri_coin/visiong_se,所包含的具体函数可查看嘉立创附件中的api手册。
其余说明:
NumPy for Rockchip RV1106 (uclibc)-说明
1. 概述
本项目包含一个针对 Rockchip RV1106 芯片(ARMv7-A 架构)和 uclibc C标准库环境特别交叉编译的 NumPy v1.24.3 版本。由于目标平台是一个资源受限的嵌入式系统,且其 C 库功能集不完整,该 NumPy 版本经过了一系列修改和配置,以确保其核心功能能够稳定运行。
2. 主要特性与修改
为了实现对 uclibc 环境的兼容,对官方 NumPy v1.24.3 源码进行了以下关键修改:
禁用了 fenv.h 浮点环境依赖:
问题: uclibc C库为了轻量化,没有提供 fenv.h 头文件。这个文件用于精确控制和检查底层的浮点数运算状态(如溢出、除零等异常)。NumPy 默认强依赖此文件,导致编译失败。
修改:
通过修改 C 源码模板 (numpy/core/src/npymath/ieee754.c.src),使用条件编译宏 (#ifndef HAVE_UCLIBC) 移除了对 <fenv.h> 的直接包含。
同样通过条件编译,屏蔽了对 fetestexcept, feclearexcept, feraiseexcept 等 fenv.h 中函数的直接调用,并让相关函数返回一个安全的默认值(例如 0),从而保留了 NumPy API 的完整性。
修复了复数数学库的编译依赖:
问题: 官方源码中,一个用于处理复数指数溢出的内部辅助函数 (_npy_scaled_cexp) 的定义被错误地与 HAVE_CEXP 宏绑定,导致在支持标准复数库但需要特殊溢出处理的 uclibc 环境下,该函数定义被排除,而调用代码依然存在,引发编译错误。
修改: 通过修改 numpy/core/src/npymath/npy_math_complex.c.src,移除了包裹 _npy_scaled_cexp 函数定义的条件编译指令,使其能够被无条件编译,从而解决了连锁编译错误。
3. 功能裁剪与保留
裁剪的功能:
精确的浮点异常状态报告: 由于 fenv.h 被禁用,依赖 numpy.geterr 和 numpy.seterr 来捕获底层硬件浮点异常(如 FE_DIVBYZERO, FE_OVERFLOW)的功能将无法工作。这些函数仍然存在,但可能总是报告默认状态,而不会反映真实的硬件标志位。对于大多数计算任务,这没有影响,但在需要进行高精度、可验证的科学计算时需要注意。
完整保留的功能:
核心 ndarray 对象: 多维数组的创建、索引、切片、变形等所有核心功能都完整无缺。
向量化运算 (UFuncs): 所有通用函数(如 np.add, np.multiply, np.sin, np.exp)均可正常使用,并且受益于 NEON 加速。
线性代数、傅里叶变换、随机数: numpy.linalg, numpy.fft, numpy.random 等主要子模块的核心功能都已保留。
数据类型: 支持所有标准的 NumPy 数据类型(np.int32, np.float32 等)。
4. 性能与优化
NEON 加速: 编译时已启用 -march=armv7-a -mfloat-abi=hard -mfpu=neon-vfpv4 标志,NumPy 内部的 SIMD 优化代码已被激活,可显著加速数组运算。
无 BLAS/LAPACK 依赖: 此版本未链接任何外部的高性能数学库(如 OpenBLAS, ATLAS)。所有线性代数等操作均依赖 NumPy 内部的 C 语言实现。对于大规模矩阵运算,其性能会低于在桌面级系统上链接了 MKL 或 OpenBLAS 的 NumPy,但这避免了交叉编译这些复杂库的巨大困难,保证了库的可用性。
5. 注意事项
默认整数类型为 int32: 由于目标平台是 32 位 ARM 架构,当您使用 np.array([1, 2, 3]) 这样不指定 dtype 的方式创建整数数组时,其默认数据类型将是 numpy.int32,而不是 PC 上常见的 numpy.int64。这有助于节省内存,但在处理超过 21 亿的整数时,需要手动指定 dtype=np.int64。
浮点异常行为: 如上所述,依赖硬件浮点异常检测的代码可能无法按预期工作。在进行除零、计算无效值(如 np.log(-1))等操作时,您仍然会得到 inf, -inf 或 nan 的结果,但底层的硬件状态标志可能无法通过 np.geterr 访问。
部署依赖: 此版本是为特定 Python 版本 (3.11) 和 uclibc 工具链编译的,不保证与其他 Python 版本或 glibc 系统兼容。部署时,必须将其放置在目标板 python3.11 的 site-packages 目录下。
opencv-python包含组件除highgui部分之外,与nihui大佬原opencv-mobile默认启用的保持一致。