当前位置: 首页 > news >正文

Rust C++ OpenCV kafka-rs实践

Rust和OpenCV的图像

以下是基于Rust和OpenCV的图像处理实例分类整理,涵盖基础操作、特征检测、机器学习等常见应用场景。所有代码需结合opencv Rust库实现(版本建议0.66+)。

基础图像操作

加载并显示图像:

use opencv::{highgui, imgcodecs};
let img = imgcodecs::imread("input.jpg", imgcodecs::IMREAD_COLOR)?;
highgui::imshow("Window", &img)?;
highgui::wait_key(0)?;

保存图像:

imgcodecs::imwrite("output.jpg", &img, &opencv::core::Vector::new())?;

转换为灰度图:

let mut gray = opencv::core::Mat::default();
opencv::imgproc::cvt_color(&img, &mut gray, opencv::imgproc::COLOR_BGR2GRAY, 0)?;

调整亮度:

let mut brighter = opencv::core::Mat::default();
img.convert_to(&mut brighter, opencv::core::CV_32F, 1.2, 30.0)?;

图像滤波与增强

高斯模糊:

let mut blurred = opencv::core::Mat::default();
opencv::imgproc::gaussian_blur(&img, &mut blurred, opencv::core::Size::new(5, 5), 0.0, 0.0, opencv::core::BORDER_DEFAULT)?;

边缘检测(Canny):

let mut edges = opencv::core::Mat::default();
opencv::imgproc::canny(&gray, &mut edges, 50.0, 150.0, 3, false)?;

直方图均衡化:

let mut equalized = opencv::core::Mat::default();
opencv::imgproc::equalize_hist(&gray, &mut equalized)?;

特征检测与匹配

SIFT关键点检测:

let mut sift = <dyn opencv::features2d::Feature2D>::create("SIFT")?;
let mut keypoints = opencv::core::Vector::new();
sift.detect(&gray, &mut keypoints, &opencv::core::no_array())?;

ORB特征匹配:

let mut orb = <dyn opencv::features2d::Feature2D>::create("ORB")?;
let (mut kp1, mut desc1) = (opencv::core::Vector::new(), opencv::core::Mat::default());
orb.detect_and_compute(&img1, &opencv::core::no_array(), &mut kp1, &mut desc1, false)?;

机器学习应用

人脸检测(Haar级联):

let mut face_detector = <dyn opencv::objdetect::CascadeClassifier>::new("haarcascade_frontalface_default.xml")?;
let mut faces = opencv::core::Vector::new();
face_detector.detect_multi_scale(&gray, &mut faces, 1.1, 3, 0, opencv::core::Size::new(30, 30), opencv::core::Size::new(300, 300))?;

K均值聚类:

let samples = opencv::core::Mat::from_slice_2d(&[[1.0, 2.0], [1.1, 2.1], [0.9, 1.9]])?;
let mut labels = opencv::core::Mat::default();
let mut centers = opencv::core::Mat::default();
opencv::core::kmeans(&samples, 2, &mut labels, opencv::core::TermCriteria::new(3, 10, 1.0)?, 3, opencv::core::KMEANS_RANDOM_CENTERS, &mut centers)?;

完整实例代码需配合以下Cargo.toml依赖:

[dependencies]
opencv = { version = "0.66", features = ["opencv-4", "contrib"] }

图像读取与显示

use opencv::{highgui, imgcodecs, Result};fn main() -> Result<()> {let img = imgcodecs::imread("input.jpg", imgcodecs::IMREAD_COLOR)?;highgui::imshow("Display Window", &img)?;highgui::wait_key(10000)?; // 显示10秒Ok(())
}

灰度转换

use opencv::{core, imgproc, imgcodecs};let mut gray = core::Mat::default();
imgproc::cvt_color(&img, &mut gray, imgproc::COLOR_BGR2GRAY, 0)?;
use opencv::{core, imgproc, imgcodecs, highgui, Result};fn main() -> Result<()> {let img = imgcodecs::imread("input.jpg", imgcodecs::IMREAD_COLOR)?;let mut gray = core::Mat::default();imgproc::cvt_color(&img, &mut gray, imgproc::COLOR_BGR2GRAY, 0)?;highgui::imshow("Gray Image", &gray)?;highgui::wait_key(0)?;Ok(())
}

边缘检测(Canny)

use opencv::{imgproc, core};let mut edges = core::Mat::default();
imgproc::canny(&gray, &mut edges, 50.0, 150.0, 3, false)?;

人脸检测(Haar级联)

use opencv::{objdetect, core, types};let mut faces = types::VectorOfRect::new();
let cascade = objdetect::CascadeClassifier::new("haarcascade_frontalface_default.xml")?;
cascade.detect_multi_scale(&img, &mut faces, 1.1, 3, 0, core::Size::new(30, 30), core::Size::default())?;

图像旋转

  • 依赖:需下载haarcascade_frontalface_default.xml文件。
  • 功能:检测人脸并绘制矩形框。
use opencv::{core, imgproc};let center = core::Point2f::new(img.cols() as f32 / 2.0, img.rows() as f32 / 2.0);
let mut rotated = core::Mat::default();
let rotation_matrix = imgproc::get_rotation_matrix_2d(center, 45.0, 1.0)?;
imgproc::warp_affine(&img, &mut rotated, &rotation_matrix, img.size()?, imgproc::INTER_LINEAR, core::BORDER_CONSTANT, core::Scalar::default())?;
use opencv::{objdetect, imgcodecs, highgui, core, Result};fn main() -> Result<()> {let mut classifier = objdetect::CascadeClassifier::new("haarcascade_frontalface_default.xml")?;let img = imgcodecs::imread("face.jpg", imgcodecs::IMREAD_COLOR)?;let mut gray = core::Mat::default();imgproc::cvt_color(&img, &mut gray, imgproc::COLOR_BGR2GRAY, 0)?;let faces = classifier.detect_multi_scale(&gray, 1.1, 3, 0, core::Size::new(30, 30), core::Size::new(300, 300))?;for face in faces {imgproc::rectangle(&mut gray.clone(), face, core::Scalar::new(255.0, 0.0, 0.0, 0.0), 2, imgproc::LINE_8, 0)?;}highgui::imshow("Faces", &gray)?;highgui::wait_key(0)?;Ok(())
}
use opencv::{imgcodecs, imgproc, core, highgui, Result};fn main() -> Result<()> {let img = imgcodecs::imread("input.jpg", imgcodecs::IMREAD_COLOR)?;let center = core::Point2f::new(img.cols() as f32 / 2.0, img.rows() as f32 / 2.0);let rot_mat = imgproc::get_rotation_matrix_2d(center, 45.0, 1.0)?;let mut rotated = core::Mat::default();imgproc::warp_affine(&img, &mut rotated, &rot_mat, img.size()?, imgproc::INTER_LINEAR, core::BORDER_CONSTANT, core::Scalar::all(0.0))?;highgui::imshow("Rotated", &rotated)?;highgui::wait_key(0)?;Ok(())
}

视频捕获

use opencv::{videoio, highgui};let mut cap = videoio::VideoCapture::new(0, videoio::CAP_ANY)?; // 摄像头0
while highgui::wait_key(1)? < 0 {let mut frame = core::Mat::default();cap.read(&mut frame)?;highgui::imshow("Live Feed", &frame)?;
}

图像阈值处理

use opencv::{imgproc, core};let mut thresholded = core::Mat::default();
imgproc::threshold(&gray, &mut thresholded, 127.0, 255.0, imgproc::THRESH_BINARY)?;
use opencv::{imgcodecs, imgproc, highgui, core, Result};fn main() -> Result<()> {
    let img = imgcodecs::imread("input.jpg", imgcodecs::IMREAD_GRAYSCALE)?;
    let mut thresh = core::Mat::default();
    imgproc::threshold(&img, &mut thresh, 127.0, 255.0, imgproc::THRESH_BINARY)?;
    highgui::imshow("Threshold", &thresh)?;
    highgui::wait_key(0)?;
    Ok(())
}


 

轮廓检测

use opencv::{imgproc, core, types};let mut contours = types::VectorOfVectorOfPoint::new();
let mut hierarchy = core::Mat::default();
imgproc::find_contours(&edges, &mut contours, &mut hierarchy, imgproc::RETR_TREE, imgproc::CHAIN_APPROX_SIMPLE, core::Point::default())?;

ORB特征检测

use opencv::{features2d, core};let mut orb = features2d::ORB::create(500, 1.2, 8, 31, 0, 2, features2d::ORB_FAST_SCORE, 31, 20)?;
let mut keypoints = types::VectorOfKeyPoint::new();
let mut descriptors = core::Mat::default();
orb.detect_and_compute(&gray, &core::Mat::default(), &mut keypoints, &mut descriptors, false)?;

图像保存

use opencv::imgcodecs;imgcodecs::imwrite("output.jpg", &rotated, &core::Vector::default())?;

每个例子需要添加opencv依赖(Cargo.toml中opencv = { version = "0.x", features = ["opencv-4"] }),并处理可能的Result类型。实际使用时需根据OpenCV版本调整路径和参数。

use opencv::{imgcodecs, imgproc, core, Result};fn main() -> Result<()> {let img = imgcodecs::imread("input.jpg", imgcodecs::IMREAD_COLOR)?;let mut gray = core::Mat::default();imgproc::cvt_color(&img, &mut gray, imgproc::COLOR_BGR2GRAY, 0)?;imgcodecs::imwrite("output.jpg", &gray, &core::Vector::new())?;Ok(())
}

绘制几何图形

 
use opencv::{core, highgui, imgproc, Result};fn main() -> Result<()> {let mut img = core::Mat::zeros(300, 300, core::CV_8UC3)?.to_mat()?;imgproc::rectangle(&mut img,core::Rect::new(50, 50, 200, 200),core::Scalar::new(0.0, 255.0, 0.0, 0.0),2,imgproc::LINE_8,0)?;highgui::imshow("Drawing", &img)?;highgui::wait_key(0)?;Ok(())
}
 
  • 功能:在黑色背景上绘制绿色矩形。
  • 扩展:可替换为circleline

摄像头实时捕获

 
use opencv::{videoio, highgui, core, Result};fn main() -> Result<()> {let mut cam = videoio::VideoCapture::new(0, videoio::CAP_ANY)?;let mut frame = core::Mat::default();loop {cam.read(&mut frame)?;highgui::imshow("Camera", &frame)?;if highgui::wait_key(10)? == 27 { break; } // ESC键退出}Ok(())
}

  • 功能:打开摄像头并显示实时画面。
  • 关键点VideoCapture初始化摄像头。

环境配置提示

  1. 安装OpenCV:确保系统安装OpenCV(建议4.x版本),并设置OPENCV_DIR环境变量。
  2. Cargo.toml
    [dependencies]
    opencv = { version = "0.66", features = ["opencv-43"] }

这些案例覆盖了图像处理的基础操作,适合逐步学习Rust与OpenCV的结合使用。

Rust与Anaconda(Python数据科学环境)

以下是10个使用Rust与Anaconda(Python数据科学环境)结合的实例案例,涵盖不同场景的集成方法:

调用Python库进行数值计算

使用pyo3库创建Rust绑定,调用Python的numpy进行矩阵运算:

use pyo3::prelude::*;
use pyo3::types::IntoPyDict;fn main() -> PyResult<()> {Python::with_gil(|py| {let np = py.import("numpy")?;let result = np.call_method1("dot", (vec![1, 2], vec![3, 4]))?;println!("Dot product: {:?}", result.extract::<i32>()?);Ok(())})
}

数据可视化交互

通过Rust生成数据,调用matplotlib绘制图表:

use pyo3::{PyResult, Python};fn plot_data() -> PyResult<()> {Python::with_gil(|py| {let plt = py.import("matplotlib.pyplot")?;let _ = plt.call_method0("plot")?;let _ = plt.call_method1("show", ())?;Ok(())})
}

机器学习模型部署

用Rust预处理数据后调用scikit-learn模型:

use pyo3::prelude::*;fn predict() -> PyResult<f64> {Python::with_gil(|py| {let sklearn = py.import("sklearn.ensemble")?;let model = sklearn.getattr("RandomForestClassifier")?.call0()?;let prediction = model.call_method1("predict", (vec![1.0, 2.0],))?;prediction.extract()})
}

高性能并行计算

结合Rust的并行能力与numba加速:

use rayon::prelude::*;
use pyo3::Python;fn parallel_compute() {let data: Vec<_> = (0..10000).collect();data.par_iter().for_each(|i| {Python::with_gil(|py| {let math = py.import("math").unwrap();let _ = math.call_method1("sqrt", (*i as f64,)).unwrap();});});
}

数据库操作集成

用Rust操作SQLite后通过pandas分析:

use pyo3::{PyResult, Python};fn analyze_data() -> PyResult<()> {Python::with_gil(|py| {let pd = py.import("pandas")?;let df = pd.call_method1("read_sql", ("SELECT * FROM table", "sqlite:///db.sqlite"))?;let _ = df.call_method0("describe")?;Ok(())})
}

自然语言处理

调用nltk进行文本处理:

use pyo3::prelude::*;fn tokenize_text(text: &str) -> PyResult<Vec<String>> {Python::with_gil(|py| {let nltk = py.import("nltk")?;let tokens = nltk.call_method1("word_tokenize", (text,))?;tokens.extract()})
}

图像处理

<
http://www.dtcms.com/a/262840.html

相关文章:

  • 生成式人工智能实战 | 变分自编码器(Variational Auto-Encoder, VAE)
  • 二刷 苍穹外卖day09
  • macos 安装 xcode
  • 借助 KubeMQ 简化多 LLM 集成
  • 深度学习专栏总结
  • 生信分析之流式数据分析:Flowjo 软件核心功能全解析
  • Openssl升级
  • 使用 LoRA 微调大模型:关键参数与最佳实践全解析
  • 深度解析基于贝叶斯的垃圾邮件分类
  • 数字孪生技术为UI前端注入灵魂:实现产品全生命周期的可视化管理
  • 银河麒麟系统上利用WPS的SDK进行WORD的二次开发
  • linux docker 客户端操作数据卷
  • Excel转pdf实现动态数据绑定
  • [附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+jsp实现的校园服务平台管理系统,推荐!
  • 【甲方安全建设】敏感数据检测工具 Earlybird 安装使用详细教程
  • 6月30日作业
  • AR 学习:开启未来学习新视界​
  • 深入解析TCP:可靠传输的核心机制与实现逻辑
  • 7,FreeRTOS列表与列表项的插入删除
  • docker安装MySQL,创建MySQL容器
  • 认识 Spring AI
  • 根据OS自动加载不同的native库和本地jar包
  • Linux驱动学习day11(定时器)
  • 百度文库智能PPT月访问量超3400万,用户规模翻倍增长
  • demo01:基于 SpringMVC 的用户管理系统
  • AlpineLinux安装部署MongoDB
  • Clickhouse源码分析-TTL执行流程
  • 杂谈-架构时代演进
  • C语言常用转换函数实现原理
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | ThemeClock(主题时钟)