作为一名资深技术开发专家,我将深入讲解如何在 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 的绘图功能。