编程 在 Rust 中使用 OpenCV 进行绘图

2024-11-19 06:58:07 +0800 CST views 820

在 Rust 中使用 OpenCV 进行绘图

本文将深入讲解如何在 Rust 中使用 OpenCV 进行绘图。OpenCV 是一个强大的计算机视觉库,提供了丰富的图像和视频处理功能,其中包括各种绘图工具。本文将介绍如何使用 OpenCV 在图像上绘制线条、形状和文本,并提供充足的示例代码。

绘制线条

OpenCV 的 imgproc 模块提供了 line 函数用于绘制直线。该函数需要以下参数:

  • img: 要绘制直线的图像。
  • pt1: 直线的起点坐标。
  • pt2: 直线的终点坐标。
  • color: 直线的颜色,使用 Scalar 类型表示。
  • thickness: 直线的粗细,以像素为单位。
  • lineType: 直线的类型,可以选择不同的抗锯齿和连接方式。
  • shift: 绘制坐标的缩放因子。

以下代码示例展示了如何绘制不同颜色、粗细和类型的直线:

use opencv::{
    core::{Point, Scalar, CV_8UC3},
    highgui::{imshow, wait_key},
    imgproc::{line, LINE_AA, LINE_8},
    prelude::*,
    Result,
};

fn main() -> Result<()> {
    let mut img = Mat::new_rows_cols_with_default(400, 400, CV_8UC3, Scalar::from((255.0, 255.0, 255.0)))?;

    // 绘制蓝色细线
    line(
        &mut img,
        Point::new(50, 50),
        Point::new(200, 50),
        Scalar::from((0.0, 0.0, 255.0)),
        1,
        LINE_AA,
        0,
    )?;

    // 绘制紫色粗线
    line(
        &mut img,
        Point::new(50, 100),
        Point::new(200, 100),
        Scalar::from((255.0, 0.0, 255.0)),
        3,
        LINE_AA,
        0,
    )?;

    // 绘制红色较粗的8连接线
    line(
        &mut img,
        Point::new(50, 150),
        Point::new(200, 150),
        Scalar::from((255.0, 0.0, 0.0)),
        10,
        LINE_8,
        0,
    )?;

    imshow("Line", &img)?;
    wait_key(0)?;
    Ok(())
}

除了直线,还可以使用 arrowed_line 函数绘制箭头,使用 draw_marker 函数绘制各种形状标记,例如十字、星形、方形等。

绘制形状

OpenCV 提供了绘制各种形状的函数,包括矩形、圆形、椭圆和多边形。

  • rectangle 函数用于绘制矩形,可以使用两个对角坐标或 Rect 对象指定矩形区域。
  • circle 函数用于绘制圆形,需要指定圆心坐标和半径。
  • ellipse 函数用于绘制椭圆,需要指定中心点、长短轴半径、旋转角度、起始角度和结束角度等参数。
  • polylines 函数用于绘制多边形,需要提供多边形各个顶点的坐标。

以下代码示例展示了如何绘制各种形状:

use opencv::{
    core::{Point, Rect, Scalar, Size_},
    highgui::{imshow, wait_key},
    imgproc::{circle, ellipse, polylines, rectangle, LINE_AA},
    prelude::*,
    Result,
};

fn main() -> Result<()> {
    let mut img = Mat::new_rows_cols_with_default(400, 400, CV_8UC3, Scalar::from((255.0, 255.0, 255.0)))?;

    // 绘制蓝色矩形
    rectangle(
        &mut img,
        Rect::new(50, 50, 100, 50),
        Scalar::from((0.0, 0.0, 255.0)),
        2,
        LINE_AA,
        0,
    )?;

    // 绘制红色实心圆
    circle(
        &mut img,
        Point::new(200, 100),
        30,
        Scalar::from((255.0, 0.0, 0.0)),
        -1, // 使用 -1 填充圆形
        LINE_AA,
        0,
    )?;

    // 绘制绿色椭圆
    ellipse(
        &mut img,
        Point::new(300, 200),
        Size_::new(60, 30),
        20.0,
        0.0,
        360.0,
        Scalar::from((0.0, 255.0, 0.0)),
        2,
        LINE_AA,
        0,
    )?;

    // 绘制紫色多边形
    let pts = vec![
        Point::new(100, 250),
        Point::new(150, 300),
        Point::new(200, 250),
        Point::new(150, 200),
    ];
    polylines(
        &mut img,
        &pts,
        true, // 使用 true 连接最后一个点和第一个点
        Scalar::from((255.0, 0.0, 255.0)),
        2,
        LINE_AA,
        0,
    )?;

    imshow("Shapes", &img)?;
    wait_key(0)?;
    Ok(())
}

添加文本

OpenCV 的 imgproc 模块还提供了 put_text 函数用于在图像上添加文本。该函数需要以下参数:

  • img: 要添加文本的图像。
  • text: 要添加的文本内容。
  • org: 文本的起始坐标。
  • fontFace: 字体的类型,可以选择不同的字体样式。
  • fontScale: 字体的缩放比例。
  • color: 文本的颜色,使用 Scalar 类型表示。
  • thickness: 文本的粗细,以像素为单位。
  • lineType: 文本的类型,可以选择不同的抗锯齿和连接方式。
  • bottomLeftOrigin: 是否使用左下角作为坐标原点,默认为 false

以下代码示例展示了如何添加不同字体、大小和颜色的文本:

use opencv::{
    core::{Point, Scalar},
    highgui::{imshow, wait_key},
    imgproc::{put_text, FONT_HERSHEY_PLAIN, FONT_HERSHEY_SIMPLEX, LINE_AA},
    prelude::*,
    Result,
};

fn main() -> Result<()> {
    let mut img = Mat::new_rows_cols_with_default(400, 400, CV_8UC3, Scalar::from((255.0, 255.0, 255.0)))?;

    put_text(
        &mut img,
        "Hello, OpenCV!",
        Point::new(50, 50),
        FONT_HERSHEY_SIMPLEX,
        1.0,
        Scalar::from((0.0, 0.0, 255.0)),
        2,
        LINE_AA,
        false,
    )?;

    put_text(
        &mut img,
        "Welcome to Rust",
        Point::new(50, 100),
        FONT_HERSHEY_PLAIN,
        2.0,
        Scalar::from((255.0, 0.0, 0.0)),
        3,
        LINE_AA,
        false,
    )?;

    imshow("Text", &img)?;
    wait_key(0)?;
    Ok(())
}

可以使用 get_text_size 函数获取文本的尺寸,以便将其精确定位到图像的中心或其他位置。

总结

本文详细介绍了如何在 Rust 中使用 OpenCV 进行绘图,包括绘制线条、形状和文本。OpenCV 提供了丰富的绘图函数和参数选项,可以满足各种绘图需求。希望本文能帮助你更好地理解和使用 OpenCV 的绘图功能。


复制全文 生成海报 编程 计算机视觉 图像处理 Rust OpenCV

推荐文章

Vue3中的虚拟滚动有哪些改进?
2024-11-18 23:58:18 +0800 CST
Python Invoke:强大的自动化任务库
2024-11-18 14:05:40 +0800 CST
Vue中的表单处理有哪几种方式?
2024-11-18 01:32:42 +0800 CST
15 个 JavaScript 性能优化技巧
2024-11-19 07:52:10 +0800 CST
对多个数组或多维数组进行排序
2024-11-17 05:10:28 +0800 CST
如何实现生产环境代码加密
2024-11-18 14:19:35 +0800 CST
npm速度过慢的解决办法
2024-11-19 10:10:39 +0800 CST
如何在Vue3中定义一个组件?
2024-11-17 04:15:09 +0800 CST
CSS 实现金额数字滚动效果
2024-11-19 09:17:15 +0800 CST
阿里云免sdk发送短信代码
2025-01-01 12:22:14 +0800 CST
# 解决 MySQL 经常断开重连的问题
2024-11-19 04:50:20 +0800 CST
Vue3中如何实现插件?
2024-11-18 04:27:04 +0800 CST
JavaScript 上传文件的几种方式
2024-11-18 21:11:59 +0800 CST
php获取当前域名
2024-11-18 00:12:48 +0800 CST
html流光登陆页面
2024-11-18 15:36:18 +0800 CST
Rust 并发执行异步操作
2024-11-18 13:32:18 +0800 CST
MySQL 优化利剑 EXPLAIN
2024-11-19 00:43:21 +0800 CST
最全面的 `history` 命令指南
2024-11-18 21:32:45 +0800 CST
H5端向App端通信(Uniapp 必会)
2025-02-20 10:32:26 +0800 CST
为什么要放弃UUID作为MySQL主键?
2024-11-18 23:33:07 +0800 CST
PHP 8.4 中的新数组函数
2024-11-19 08:33:52 +0800 CST
Linux 常用进程命令介绍
2024-11-19 05:06:44 +0800 CST
程序员茄子在线接单