在 Rust 中使用 OpenCV 进行绘图

架构大师笔记
架构大师笔记
发布于 2024-08-28 / 10 阅读
0
0

在 Rust 中使用 OpenCV 进行绘图

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

绘制线条

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

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

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

use opencv::{
    core::{Point, Scalar, Size_},
    highgui::{imshow, wait_key},
    imgproc::{arrowed_line, draw_marker, line, LINE_4, LINE_8, LINE_AA, MARKER_CROSS, MARKER_DIAMOND, MARKER_SQUARE, MARKER_STAR, MARKER_TILTED_CROSS, MARKER_TRIANGLE_DOWN, MARKER_TRIANGLE_UP},
    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, line, 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 mut 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::{get_text_size, put_text, FONT_HERSHEY_COMPLEX, 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 的绘图功能。


评论