87 次重大发布
0.90.2 | 2024年8月1日 |
---|---|
0.90.1 | 2024年7月22日 |
0.90.0 | 2024年5月26日 |
0.85.0 | 2024年3月18日 |
0.5.0 | 2020年3月20日 |
#220 在 图像
56,242 每月下载次数
在 305 个 crate 中使用(通过 opencv)
565KB
15K SLoC
Rust OpenCV 绑定
Rust 对流行的 OpenCV 计算机视觉库的绑定。
API 可用,但不稳定,且未经过充分测试;使用风险自负。
快速入门
确保系统已安装支持的 OpenCV 版本(3.4 或 4.x)和 Clang(LLVM 的一部分,用于自动绑定生成)。
更新 Cargo.toml
opencv = "0.92.2"
导入预览
use opencv::prelude::*;
获取 OpenCV
有关如何安装所需的系统依赖项的说明,请参阅 INSTALL.md。
故障排除
有关一些常见问题和解决方案的说明,请参阅 TROUBLESHOOTING.md。
环境变量
在没有 pkg_config
、cmake
或 vcpkg
的情况下构建时,必须设置以下变量。您可以在任何平台上设置它们,指定的值将覆盖自动发现的值。
-
OPENCV_LINK_LIBS
要链接的库名称的逗号分隔列表。.lib
、.so
或.dylib
扩展名是可选的。如果您指定 ".framework" 扩展名,则构建脚本将链接 macOS 框架而不是普通共享库。例如 "opencv_world411"。如果此列表以“+”开头,则指定的项目将被添加到系统探测返回的内容中。例如,“+dc1394”将进行对OpenCV库及其链接库的系统发现,并在末尾额外链接
dc1394
库。如果系统探测产生了一个大部分可以工作的设置,但链接列表不完整,或者顺序错误(尤其是在静态链接期间尤为重要),这可能很有用。 -
OPENCV_LINK_PATHS
搜索库以链接的路径列表,用逗号分隔。例如,“C:\tools\opencv\build\x64\vc15\lib”。路径列表可以以“+”开头,有关详细说明,请参阅OPENCV_LINK_LIBS
(例如,“+/usr/local/lib”)。 -
OPENCV_INCLUDE_PATHS
编译期间搜索系统头文件的路径列表,用逗号分隔。例如,“C:\tools\opencv\build\include”。其中指定的目录之一必须包含“opencv2/core/version.hpp”或“core/version.hpp”文件,用于检测头文件版本。路径列表可以以“+”开头,有关详细说明,请参阅OPENCV_LINK_LIBS
(例如,“+/opt/cuda/targets/x86_64-linux/include/”)。
以下变量很少使用,但在某些情况下可能需要它们
-
OPENCV_PACKAGE_NAME
在某些情况下,您可能希望覆盖pkg-config、cmake或vcpkg的包名,您可以使用此环境变量来做到这一点。如果您设置了它,pkg-config将期望在包目录中找到具有该名称和.pc
扩展名的文件。cmake将查找具有.cmake
扩展名的文件。vcpkg将使用该名称在packages
目录下尝试查找包(位于VCPKG_ROOT
下)。您还可以使用单独的环境变量为不同的包系统设置不同的包名OPENCV_PKGCONFIG_NAME
OPENCV_CMAKE_NAME
OPENCV_VCPKG_NAME
-
OPENCV_CMAKE_BIN
cmake二进制文件的路径(在OpenCV使用cmake的发现过程中使用)。如果未设置,则将使用“cmake”。例如,您可以在这里设置类似“/usr/local/bin/cmake”的内容。 -
OPENCV_DISABLE_PROBES
搜索要排除运行的OpenCV包自动发现系统的逗号分隔列表。如果较高优先级的系统产生了错误的结果,这可能很有用。可以包含以下值- 环境 - 仅从
OPENCV_LINK_LIBS
、OPENCV_LINK_PATHS
和OPENCV_INCLUDE_PATHS
环境变量中读取数据 - pkg_config
- cmake
- vcpkg_cmake - 与vcpkg类似,但仅使用vcpkg进行路径发现,实际的OpenCV探测使用cmake(适用于此探测的cmake相关环境变量适用)
- vcpkg
- 环境 - 仅从
-
OPENCV_MSVC_CRT
允许在Windows上使用MSVC构建时选择CRT库。允许的值是"static"
对应于/MT
和"dynamic"
对应于/MD
。
以下变量影响构建opencv
crate,但属于外部组件
-
PKG_CONFIG_PATH
查找*.pc
文件的位置;请参阅man pkg-config 指定的路径必须包含opencv.pc
(在OpenCV 4之前)或opencv4.pc
(OpenCV 4及以后版本)。 -
VCPKG_ROOT
、VCPKGRS_DYNAMIC
和VCPKGRS_TRIPLET
。这是vcpkg
安装根目录,标志允许使用*.dll
库以及选定的vcpkg
三联组,请参阅vcpkg
crate 的文档。 -
OpenCV_DIR
包含 OpenCV 包 cmake 文件的目录。通常其中包括OpenCVConfig.cmake
、OpenCVConfig-version.cmake
和OpenCVModules.cmake
。 -
LD_LIBRARY_PATH
在 Linux 上设置在运行时查找已安装*.so
文件的目录列表。有关更多信息,请参阅 Linux 文档。此处指定的路径必须包含libopencv_*.so
文件。 -
DYLD_LIBRARY_PATH
和DYLD_FALLBACK_LIBRARY_PATH
与LD_LIBRARY_PATH
类似,但在 macOS 上加载*.dylib
文件时使用,请参阅 man dyld 和 此 SO 答案 了解更多信息。此处指定的路径必须包含*.dylib
文件。 -
PATH
Windows 在PATH
中搜索*.dll
,确保设置正确,或者将所需的 OpenCV*.dll
复制到您的二进制文件旁边。确保以 UNIX 风格指定路径(/C/Program Files/Dir),因为PATH
中的冒号可能被解释为条目分隔符。请参阅 此处 的摘要。 -
clang crate 环境变量 请参阅 crate 的 README
Cargo 功能
- 每个 OpenCV 模块都有一个以该模块命名的功能(例如
imgproc
、highgui
等)。它们默认都启用,但如果找不到相应的模块,则将静默忽略。如果您需要选择一组特定的模块,请确保禁用默认功能并提供所需的特征集opencv = { version = ..., default-features = false, features = ["calib3d", "features2d", "flann"]}
rgb
- 允许使用rgb
crate 类型作为Mat
元素
API 详细信息
API 文档 是从 OpenCV 的 doxygen 文档自动翻译的。您很可能会仍然需要参考官方的 OpenCV C++ 文档。
OpenCV 版本支持
目前支持以下 OpenCV 版本
- 3.4
- 4.x
最小 rustc 版本(MSRV)
目前,需要 Rust 版本 1.66.0 或更高版本。一般政策是支持一年前的 rust 版本。提升比那更旧的版本不被视为破坏性变更。
平台支持
目前,该 crate 的主要开发和测试是在 Linux 上进行的,但也支持其他主要平台:macOS 和 Windows。
有关更多详细信息,请参阅CI构建脚本:Linux OpenCV安装、macOS以框架方式安装OpenCV、macOS通过brew安装OpenCV、通过Chocolatey安装Windows OpenCV、通过vcpkg安装Windows OpenCV、测试运行器脚本。
功能
通常,该包试图只封装OpenCV API并提供一些便利函数,以便更容易地在Rust中使用。我们尽量不添加任何其他功能。
错误
大多数函数返回一个Result
来暴露潜在的C++异常。尽管某些方法,如属性读取或OpenCV头文件中标记为CV_NOEXCEPT的函数是不可靠的,并返回一个裸值。
CV_MAKETYPE
CV_MAKETYPE
和相关的CV_MAT_DEPTH
常量函数可用于替换相应的OpenCV宏。然而,通常在相应的Rust类型上调用::opencv_type()
函数更容易。例如。
let t = u16::opencv_type(); // equivalent to CV_MAKETYPE(CV_16U, 1)
let t = Vec2f::opencv_type(); // equivalent to CV_MAKETYPE(CV_32F, 2)
C++运算符
支持一些C++运算符,它们被转换为Rust端的相应函数。以下是相应的函数名列表
[]
→get()
或get_mut()
+
、-
→add()
、sub()
*
、/
→mul()
、div()
()
(函数调用)→apply()
=
→set()
*
(解引用)→try_deref()
或try_deref_mut()
==
、!=
→equals()
、not_equals()
>
、>=
→greater_than()
、greater_than_or_equal()
<
,<=
→less_than()
,less_than_or_equal()
++
,--
→incr()
,decr()
&
,|
,^
→and()
,or()
,xor()
!
→negate()
类字段
OpenCV类的字段可以通过setter和getter访问。这些函数是可靠的,它们直接返回值,而不是返回Result
。
可靠的函数
对于接受&str
值的可靠函数(如setter)适用以下逻辑:如果作为参数传递的Rust字符串包含空字节,则该字符串将截断到该空字节。因此,如果您将"123\0456"传递给setter,则属性将设置为"123"。
回调函数
一些API函数接受回调函数,例如set_mouse_callback
。虽然目前可以使用这些函数,但仍有一些限制需要注意。当前回调处理的实现泄漏了传递的回调参数。这意味着用作回调的闭包将在程序的生命周期内永远不会被释放,并且此外不会为其调用Drop。有一个计划来实现能够释放至少一些闭包的可能性。
不安全性
尽管该包试图为OpenCV提供一个符合人体工程学的Rust接口,但在此阶段不要期望获得Rust的安全性保证。这尤其适用于借用检查和共享可变所有权的。一个值得注意的例子是Mat
,它本质上是一个引用计数对象。在Rust术语中,您可以拥有一个看似独立的Mat
,但在底层它将成为对另一个Mat
的可变引用。将此包的API安全性视为您将对待C++中的一项,在需要时使用clone()
。
贡献模块
要使用某些模块,您需要安装opencv_contrib
。您可以在opencv_contrib
中找到贡献模块的完整列表。
缺失的模块和函数
虽然大多数API都得到了覆盖,但由于各种原因(可能不再成立),有一些模块和函数尚未实现。如果缺少的模块/函数对您来说非常重要,请提交问题(或者更好的,提交一个拉取请求)!
绑定策略
这个crate的功能类似于Python和Java的OpenCV包装器模型 - 它使用libclang解析OpenCV C++头文件,生成C接口到C++ API,并在Rust中包装C接口。
C++ API中的所有主要模块都合并到一个巨大的cv::
命名空间中。我们为每个主要的OpenCV模块创建了一个Rust模块。例如,在这个crate中,C++的cv::Mat
是opencv::core::Mat
。
方法和字段名已被转换为snake_case。具有默认值的方法参数将失去这些默认值,但它们将在API文档中报告。
重载的方法大部分已被手动赋予不同的名称或自动重命名为*_1, *_2等。
旧版OpenCV分支支持
OpenCV 2
如果您不能使用OpenCV 3.x或更高版本,已知此crate的(不再维护的)0.2.4版本可以与OpenCV 2.4.7.13(以及其他2.4版本)一起工作。请参阅README.md文件以获取该版本的信息,因为自那时起crate已经经历了相当大的重写。
OpenCV 3.2
最后一个具有OpenCV 3.2支持的版本是0.75.0,之后此OpenCV分支不再进行测试和支持。尽管如此,它仍然可能工作。
贡献者指南
绑定生成器代码位于binding-generator下的独立crate中。在构建阶段,它从头文件中创建绑定并将它们放入bindings目录。然后,这些绑定被转移到src目录,由crate用户使用。
用户导入的crate本身由提交到仓库中的src目录下的生成Rust代码组成。这样,用户就不需要在构建中处理代码生成开销。在开发此crate时,您可以使用cargo build -vv
测试绑定生成的更改。当更改binding-generator
时,请确保将更改推送到生成的代码!
如果您正在寻找需要改进的内容,请务必在项目源中搜索todo
和fixme
标签,这些通常包含需要修复的具体说明。
原始作品的许可协议为MIT。
特别感谢ttacon提供crate名称。
依赖关系
~2.7–8.5MB
~63K SLoC