Rust C++ OpenCV kafka-rs实践

发布于:2025-07-01 ⋅ 阅读:(26) ⋅ 点赞:(0)

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()
    })
}

图像处理

<

网站公告

今日签到

点亮在社区的每一天
去签到