在 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 的绘图功能。