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

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

在 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

推荐文章

MyLib5,一个Python中非常有用的库
2024-11-18 12:50:13 +0800 CST
php指定版本安装php扩展
2024-11-19 04:10:55 +0800 CST
Go中使用依赖注入的实用技巧
2024-11-19 00:24:20 +0800 CST
js函数常见的写法以及调用方法
2024-11-19 08:55:17 +0800 CST
38个实用的JavaScript技巧
2024-11-19 07:42:44 +0800 CST
一键压缩图片代码
2024-11-19 00:41:25 +0800 CST
html5在客户端存储数据
2024-11-17 05:02:17 +0800 CST
Go 如何做好缓存
2024-11-18 13:33:37 +0800 CST
Requests库详细介绍
2024-11-18 05:53:37 +0800 CST
Go 中的单例模式
2024-11-17 21:23:29 +0800 CST
对多个数组或多维数组进行排序
2024-11-17 05:10:28 +0800 CST
JS中 `sleep` 方法的实现
2024-11-19 08:10:32 +0800 CST
html一个包含iPhoneX和MacBook模拟器
2024-11-19 08:03:47 +0800 CST
Go语言中的`Ring`循环链表结构
2024-11-19 00:00:46 +0800 CST
Python 基于 SSE 实现流式模式
2025-02-16 17:21:01 +0800 CST
程序员茄子在线接单