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

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

在 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

推荐文章

JavaScript 流程控制
2024-11-19 05:14:38 +0800 CST
Manticore Search:高性能的搜索引擎
2024-11-19 03:43:32 +0800 CST
在JavaScript中实现队列
2024-11-19 01:38:36 +0800 CST
维护网站维护费一年多少钱?
2024-11-19 08:05:52 +0800 CST
Vue3中哪些API被废弃了?
2024-11-17 04:17:22 +0800 CST
go命令行
2024-11-18 18:17:47 +0800 CST
Requests库详细介绍
2024-11-18 05:53:37 +0800 CST
FastAPI 入门指南
2024-11-19 08:51:54 +0800 CST
Vue中的异步更新是如何实现的?
2024-11-18 19:24:29 +0800 CST
windon安装beego框架记录
2024-11-19 09:55:33 +0800 CST
如何开发易支付插件功能
2024-11-19 08:36:25 +0800 CST
LLM驱动的强大网络爬虫工具
2024-11-19 07:37:07 +0800 CST
如何在Vue3中处理全局状态管理?
2024-11-18 19:25:59 +0800 CST
html流光登陆页面
2024-11-18 15:36:18 +0800 CST
# 解决 MySQL 经常断开重连的问题
2024-11-19 04:50:20 +0800 CST
手机导航效果
2024-11-19 07:53:16 +0800 CST
阿里云免sdk发送短信代码
2025-01-01 12:22:14 +0800 CST
程序员茄子在线接单