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

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

在 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

推荐文章

赚点点任务系统
2024-11-19 02:17:29 +0800 CST
如何配置获取微信支付参数
2024-11-19 08:10:41 +0800 CST
如何将TypeScript与Vue3结合使用
2024-11-19 01:47:20 +0800 CST
Vue 中如何处理跨组件通信?
2024-11-17 15:59:54 +0800 CST
Rust 并发执行异步操作
2024-11-19 08:16:42 +0800 CST
2024年微信小程序开发价格概览
2024-11-19 06:40:52 +0800 CST
如何在Vue中处理动态路由?
2024-11-19 06:09:50 +0800 CST
介绍 Vue 3 中的新的 `emits` 选项
2024-11-17 04:45:50 +0800 CST
Vue3中如何实现国际化(i18n)?
2024-11-19 06:35:21 +0800 CST
Vue3中如何实现状态管理?
2024-11-19 09:40:30 +0800 CST
Vue3结合Driver.js实现新手指引功能
2024-11-19 08:46:50 +0800 CST
Elasticsearch 监控和警报
2024-11-19 10:02:29 +0800 CST
为什么要放弃UUID作为MySQL主键?
2024-11-18 23:33:07 +0800 CST
Vue 3 路由守卫详解与实战
2024-11-17 04:39:17 +0800 CST
Go语言中的`Ring`循环链表结构
2024-11-19 00:00:46 +0800 CST
jQuery `$.extend()` 用法总结
2024-11-19 02:12:45 +0800 CST
程序员茄子在线接单