opencv-rust.md
opencv-rust
此文使用项目: opencv-rust
学习参考: opencv c++
version: rust 2021 opencv 4.5.4
使用
在cargo.toml添加:
[package] name = "game-ip" version = "0.1.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] opencv = "0.61.3"
或: 在项目目录下运行 cargo add opencv-rust
测试
cargo build
Linux
yay -S opencv llvm clang
Window
choco install llvm opencv
also set OPENCV_LINK_LIBS
, OPENCV_LINK_PATHS
and OPENCV_INCLUDE_PATHS
environment variables (see below for details).
具体: https://github.com/twistedfall/opencv-rust/issues/118#issuecomment-619608278
Introduction to OpenCV
读取图片
use opencv::core::{self, find_file}; use opencv::highgui::{imshow, wait_key}; use opencv::imgcodecs::{self, IMREAD_COLOR}; use opencv::prelude::MatTraitConst; pub fn main() { let image_path = find_file("img.png", true, false).unwrap(); let img = imgcodecs::imread(&image_path, IMREAD_COLOR).unwrap(); // 此处,需要导入 opencv::prelude::MatTraitConst 此Trait, if img.empty() { println!("Could not read th image file: {}", image_path); return ; } imshow("Display Window", &img).unwrap(); let k = wait_key(0).unwrap(); // 0表示一直等待 // i32 转 char应该有更好的写法 if k == 's' as i32 { imgcodecs::imwrite("2.png", &img, &core::Vector::new()).unwrap(); } }
opencv不同的模块负责不同的图像处理部分。
core
: 定义库的基本构建blockimgcodecs
: 处理(图片)输入和输出 [读取和写入]highgui
: 处理图像显示部分 (GUI)
函数:
-
imread
:参数
-
图片路径
-
图片格式:
IMREAD_COLOR
(default) 以BGR 8bit格式加载IMREAD_UNCHANGED
原图? 会包含透明通道IMREAD_GRAYSCALE
灰度图
返回
Mat
格式 -
Mat
Opencv内部负责图片的内存管理
Mat负责表述图片结构。结构为: Mat header
和pointer
(指向实际图片数据)。Opencv使用引用技术,一个图片数据可能会在多个mat之间共享。多个Mat之间不同的只是header
,复制时只复制头部。
/** * A-E全部使用一个matrix数据 */ Mat A, C; // creates just the header parts A = imread(argv[1], IMREAD_COLOR); // here we'll know the method used (allocate matrix) Mat B(A); // Use the copy constructor C = A; // Assignment operator // 仅使用一部分 Mat D (A, Rect(10, 10, 100, 100) ); // using a rectangle Mat E = A(Range::all(), Range(1,3)); // using row and column boundaries
当需要复制matrix
时,调用A.clone()
或A.copyTo(G)
Opencv使用BGR
颜色构建,不是RGB
。
主要颜色表达格式:
- RGB
- HSV and HLS 将颜色分解为其色调、饱和度和值/亮度分量
- YCrCb jpeg
- CIE Lab* 测距
创建Mat
-
cv::Mat::Constructor
Mat M(2,2, CV_8UC3, Scalar(0,0,255)); cout << "M = " << endl << " " << M << endl << endl; 先指
row
和column
,再指定数据类型。// cv的格式 CV_[The number of bits per item][Signed or Unsigned][Type Prefix]C[The channel number] Scalar
用于填充数据。 -
cv::Mat::create
:// 不能用于替代构造函数,当大小不合适时,会重新分配内存 M.create(4,4, CV_8UC(2)); -
MATLAB风格:
[cv::Mat::zeros] , [cv::Mat::ones], [cv::Mat::eye]
Mat E = Mat::eye(4, 4, CV_64F); cout << "E = " << endl << " " << E << endl << endl; Mat O = Mat::ones(2, 2, CV_32F); cout << "O = " << endl << " " << O << endl << endl; Mat Z = Mat::zeros(3,3, CV_8UC1); cout << "Z = " << endl << " " << Z << endl << endl; -
cv::Mat::clone()
和cv::Mat::copyTo()
-
cv::randu
随机Mat R = Mat(3, 2, CV_8UC3); // 需指定上下限 randu(R, Scalar::all(0), Scalar::all(255));
输出
Pointf
TODO: rust暂未找到相关函数?
Scan image && lookup tables && time measure
矩阵掩码
本文作者:nsfoxer
本文链接:https://www.cnblogs.com/nsfoxer/p/16317430.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步