前言
在Android音视频开发中,网上知识点过于零碎,自学起来难度非常大,不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》,结合我自己的工作学习经历,我准备写一个音视频系列blog。本文是音视频系列blog的其中一个, 对应的要学习的内容是:使用OpenCV完成绘制直线、绘制几何图形、绘制文字、创建窗口。
音视频系列blog
音视频系列blog: 点击此处跳转查看
目录
1 绘制直线、矩形、多边形
1.1 绘制直线
VS2017(或者其他版本VS)如何导入OpenCV,如果你不清楚,可以参考我的这篇文章:
效果图:
要使用OpenCV绘制直线,可以使用cv::line
函数。下是这个示例,演示如何在图像上绘制一条直线:
cpp
#include <opencv2/opencv.hpp>
int main() {
// 创建一个空白图像
cv::Mat image(400, 600, CV_8UC3, cv::Scalar(255, 255, 255)); // 白色背景
// 定义直线的起点和终点坐标
cv::Point start(100, 100);
cv::Point end(500, 300);
// 指定直线的颜色(BGR格式)和线宽
cv::Scalar color(0, 0, 255); // 红色
// 线条宽度
int thickness = 2;
// 在图像上绘制直线
cv::line(image, start, end, color, thickness);
// 显示图像窗口并等待按键
cv::imshow("Line Drawing", image);
cv::waitKey(0);
return 0;
}
在这个示例中,首先创建了一个白色背景的图像,然后定义了直线的起点和终点坐标,指定了直线的颜色和线宽,最后使用cv::line
函数在图像上绘制直线。
cv::Mat image(400, 600, CV_8UC3, cv::Scalar(255, 255, 255));
cv::Mat image
创建了一个空白背景的图像,以下是这几个参数的含义:
-
400
:这是图像的高度,表示图像的垂直像素数。在这里,图像的高度为400像素。 -
600
:这是图像的宽度,表示图像的水平像素数。在这里,图像的宽度为600像素。 -
CV_8UC3
:这是图像的数据类型和通道数的组合。在这里,它有三个部分:CV
表示OpenCV的命名空间。8U
表示每个像素通道的数据类型是8位无符号整数,即每个通道的像素值在0到255之间。C3
表示图像有3个通道,通常对应于彩色图像中的三个颜色通道:蓝色、绿色和红色(BGR顺序)。
-
cv::Scalar(255, 255, 255)
:这是用于初始化图像的初始像素值。在这里,cv::Scalar
是一个用于表示多通道数据的OpenCV类,它包含了三个值,分别对应于图像的三个通道(蓝色、绿色、红色)。255, 255, 255
表示将图像初始化为全白色,因为每个通道的值都是255,这对应于白色。如果你想使用其他颜色,可以修改这三个数字。
因此,这行代码创建了一个宽度为600像素,高度为400像素的3通道图像,初始值为全白色。这个图像可以用于进一步的图像处理和绘制操作。
cv::line(image, start, end, color, thickness);
cv::line
是OpenCV中用于在图像上绘制直线的函数,以下是这些参数的含义:
image
:这是要在其上绘制直线的图像,通常是一个cv::Mat
类型的图像对象,就是上面创建的空白背景的图像。start
:这是直线的起点坐标,它是一个cv::Point
类型的对象。cv::Point
是OpenCV中用于表示2D点的类,通常由两个整数坐标值构成,分别表示x和y坐标。在上面的示例中,start
变量包含直线的起点坐标。end
:这是直线的终点坐标,同样是一个cv::Point
类型的对象。它包含直线的终点坐标。color
:这是直线的颜色,通常由一个cv::Scalar
对象表示。cv::Scalar
是OpenCV中用于表示多通道颜色的类。在BGR(蓝绿红)颜色空间中,cv::Scalar
对象包含三个值,分别对应于蓝色、绿色和红色通道的颜色强度。例如,红色可以表示为cv::Scalar(0, 0, 255)
,其中蓝色和绿色通道的值为0,而红色通道的值为255。thickness
:这是直线的线宽,即线的粗细程度。它通常是一个整数值,用于指定直线的像素宽度。在上面示例中,定义了一个整数变量thickness
并将其初始化为2,就是绘制的直线是2个像素宽度。
通过调用 cv::line
函数并传递这些参数,可以在图像上绘制一条带有指定颜色和线宽的直线,起点和终点由 start
和 end
参数指定。
1.2 绘制矩形
效果图:
要使用OpenCV中绘制矩形,可以使用cv::rectangle
函数。以下是一个示例代码,演示如何在图像上绘制一个矩形:
cpp
#include <opencv2/opencv.hpp>
int main() {
// 创建一个空白图像
cv::Mat image(400, 600, CV_8UC3, cv::Scalar(255, 255, 255)); // 白色背景
// 定义矩形的左上角和右下角坐标
cv::Point topLeft(100, 100);
cv::Point bottomRight(300, 200);
// 指定矩形的颜色(BGR格式)和线宽
cv::Scalar color(0, 0, 255); // 红色
// 线条宽度
int thickness = 2;
// 在图像上绘制矩形
cv::rectangle(image, topLeft, bottomRight, color, thickness);
// 显示图像窗口并等待按键
cv::imshow("Rectangle Drawing", image);
cv::waitKey(0);
return 0;
}
首先创建了一个白色背景的图像,然后定义了矩形的左上角和右下角坐标,指定了矩形的颜色和线宽,最后使用cv::rectangle
函数在图像上绘制矩形。
cv::rectangle(image, topLeft, bottomRight, color, thickness);
绘制矩形与绘制直线类似,以下是rectangle()中各个参数的含义:
image
:这是要在其上绘制矩形的图像,即背景图像。topLeft
:这是矩形的左上角坐标,通常是一个cv::Point
类型的对象。cv::Point
表示2D点,它包含了x和y坐标值,指定了矩形的左上角位置。bottomRight
:这是矩形的右下角坐标,也是一个cv::Point
类型的对象,指定了矩形的右下角位置。color
:这是矩形的颜色,通常由一个cv::Scalar
对象表示。cv::Scalar
表示多通道颜色,通常在BGR颜色空间中表示。例如,cv::Scalar(0, 0, 255)
表示红色。thickness
(第五个参数):这是矩形的线宽,即绘制矩形的线的粗细程度,通常是一个整数值。
使用这些参数,cv::rectangle
函数会在指定的图像上绘制一个矩形,矩形的左上角和右下角由 topLeft
和 bottomRight
参数指定,颜色由 color
参数指定,线宽由 thickness
参数指定。
1.3 绘制多边形
效果图:
要在OpenCV中绘制多边形,您可以使用 cv::polylines
函数。以下是一个示例代码,演示如何绘制多边形:
cpp
#include <opencv2/opencv.hpp>
int main() {
// 创建一个空白图像
cv::Mat image(400, 600, CV_8UC3, cv::Scalar(255, 255, 255)); // 白色背景
// 定义多边形的顶点
std::vector<cv::Point> points;
points.push_back(cv::Point(100, 100));
points.push_back(cv::Point(300, 100));
points.push_back(cv::Point(400, 300));
points.push_back(cv::Point(200, 400));
// 将多边形的第一个点复制到最后一个点,以闭合多边形
points.push_back(points[0]);
// 设置多边形的颜色(BGR格式)和线宽
cv::Scalar color(0, 0, 255); // 红色
int thickness = 2;
// 使用指定的顶点、颜色和线宽绘制多边形
std::vector<std::vector<cv::Point>> contours;
contours.push_back(points);
cv::polylines(image, contours, true, color, thickness);
// 显示图像窗口并等待按键
cv::imshow("Polygon Drawing", image);
cv::waitKey(0);
return 0;
}
在这个示例中,我们首先创建了一个白色背景的图像,然后定义了多边形的顶点,将这些顶点存储在 std::vector<cv::Point>
中。为了闭合多边形,我们将多边形的第一个点复制到最后一个点。
然后,我们设置了多边形的颜色和线宽:
color
:多边形的颜色,这里设置为红色(cv::Scalar(0, 0, 255)
)。thickness
:线宽,用于控制多边形的线的粗细。
接下来,我们使用 cv::polylines
函数来绘制多边形。在函数中,我们将多边形的顶点传递给 cv::polylines
,并设置了颜色和线宽参数。最后一个参数 true
表示要闭合多边形。
这样,您可以绘制带有指定顶点、颜色和线宽的多边形在图像上。您可以根据需要修改多边形的顶点坐标以绘制不同的多边形。
2 绘制圆形与椭圆
2.1 绘制圆形
效果图:
要在OpenCV中绘制圆形,可以使用 cv::circle
函数。以下是一个示例代码,演示如何在图像上绘制一个圆形:
cpp
#include <opencv2/opencv.hpp>
int main() {
// 创建一个空白图像
cv::Mat image(400, 600, CV_8UC3, cv::Scalar(255, 255, 255)); // 白色背景
// 定义圆心坐标
cv::Point center(300, 200);
// 定义圆的半径
int radius = 50;
// 指定圆的颜色(BGR格式)和线宽
cv::Scalar color(0, 0, 255); // 红色
int thickness = 2;
// 在图像上绘制圆
cv::circle(image, center, radius, color, thickness);
// 显示图像窗口并等待按键
cv::imshow("Circle Drawing", image);
cv::waitKey(0);
return 0;
}
在这个示例中,首先创建了一个白色背景的图像,然后定义了圆的圆心坐标、半径、颜色和线宽。最后,使用 cv::circle
函数在图像上绘制圆。
cv::circle(image, center, radius, color, thickness);
cv::circle
函数用于在OpenCV中绘制圆形,以下是这个函数的各个参数的含义:
image
:这是要在其上绘制圆形的图像,即背景图像。center
:这是圆的圆心坐标,通常是一个cv::Point
类型的对象。cv::Point
表示2D点,它包含了x和y坐标值,指定了圆的中心位置。radius
:这是圆的半径,通常是一个整数值,表示圆的大小。color
:这是圆的颜色,通常由一个cv::Scalar
对象表示。cv::Scalar
表示多通道颜色,通常在BGR颜色空间中表示。例如,cv::Scalar(0, 0, 255)
表示红色。thickness
:这是圆的线宽,即绘制圆的线的粗细程度,通常是一个整数值。如果thickness
为正数,表示绘制实心圆;如果thickness
为负数(例如 -1),表示绘制一个填充的圆,即实心圆。
使用这些参数,cv::circle
函数会在指定的图像上绘制一个圆形,圆的圆心由 center
参数指定,半径由 radius
参数指定,颜色由 color
参数指定,线宽由 thickness
参数指定。
2.2 绘制椭圆
效果图:
要在OpenCV中绘制椭圆,可以使用 cv::ellipse
函数。以下是一个示例代码,演示如何在图像上绘制一个椭圆:
cpp
#include <opencv2/opencv.hpp>
int main() {
// 创建一个空白图像
cv::Mat image(400, 600, CV_8UC3, cv::Scalar(255, 255, 255)); // 白色背景
// 定义椭圆的参数
cv::Point center(300, 200); // 椭圆的中心坐标
cv::Size axes(100, 50); // 长轴和短轴的长度
double angle = 30.0; // 椭圆的旋转角度
double startAngle = 0.0; // 起始角度
double endAngle = 360.0; // 终止角度
cv::Scalar color(0, 0, 255); // 红色
int thickness = 2;
// 在图像上绘制椭圆
cv::ellipse(image, center, axes, angle, startAngle, endAngle, color, thickness);
// 显示图像窗口并等待按键
cv::imshow("Ellipse Drawing", image);
cv::waitKey(0);
return 0;
}
在这个示例中,首先创建了一个白色背景的图像,然后定义了椭圆的参数,包括中心坐标、长轴和短轴的长度、旋转角度、起始角度、终止角度、颜色和线宽。最后,使用 cv::ellipse
函数在图像上绘制椭圆。
cv::ellipse(image, center, axes, angle, startAngle, endAngle, color, thickness);
cv::ellipse
函数用于在OpenCV中绘制椭圆,以下是这个函数的各个参数的含义:
image
:这是要在其上绘制椭圆的图像,即背景图像。center
:这是椭圆的中心坐标,通常是一个cv::Point
类型的对象。cv::Point
表示2D点,它包含了x和y坐标值,指定了椭圆的中心位置。axes
:这是一个cv::Size
类型的对象,表示椭圆的两个轴的长度。通常,其中的width
(宽度) 对应于长轴的长度,而height
(高度) 对应于短轴的长度。angle
:这是椭圆的旋转角度,以度为单位。正值表示顺时针旋转,负值表示逆时针旋转。如果angle = 0则表示该椭圆与X轴对齐。startAngle
:这是椭圆的起始角度,以度为单位。它指定了从椭圆的哪个角度开始绘制。起始角度startAngle
通常是相对于X轴正方向的角度。在OpenCV中,默认的角度测量方式是逆时针方向的,因此起始角度0.0表示与X轴正方向相对应。从这个起始角度开始,可以顺时针或逆时针绘制椭圆,具体取决于旋转角度和终止角度的值以及绘制的方向。例如,如果startAngle
为0.0,endAngle
为180.0,那么将绘制一个与X轴正方向相对的半圆。如果startAngle
为0.0,endAngle
为360.0,那么将绘制一个完整的椭圆。endAngle
:这是椭圆的终止角度,以度为单位。它指定了在椭圆的哪个角度结束绘制。color
:这是椭圆的颜色,通常由一个cv::Scalar
对象表示。cv::Scalar
表示多通道颜色,通常在BGR颜色空间中表示。例如,cv::Scalar(0, 0, 255)
表示红色。thickness
:这是椭圆的线宽,即绘制椭圆的线的粗细程度,通常是一个整数值。如果thickness
为正数,表示绘制实线椭圆;如果thickness
为负数,表示绘制填充的椭圆,即实心椭圆。
使用这些参数,cv::ellipse
函数会在指定的图像上绘制一个椭圆,根据中心坐标、轴的长度、旋转角度以及起始和终止角度来定义椭圆的形状和位置。颜色和线宽参数用于定义椭圆的外观特征。
3 绘制随机直线与随机矩形
3.1 绘制随机直线
效果图:
要在OpenCV中绘制随机直线,可以使用随机数生成器来生成随机的线条参数,然后使用cv::line
函数绘制直线。以下是一个示例代码,演示如何绘制随机直线:
cpp
#include <opencv2/opencv.hpp>
#include <cstdlib> // 包含随机数生成器所需的头文件
int main() {
// 创建一个空白图像
cv::Mat image(400, 600, CV_8UC3, cv::Scalar(255, 255, 255)); // 白色背景
// 随机生成直线的参数
int x1 = rand() % image.cols; // 随机生成起点 x 坐标
int y1 = rand() % image.rows; // 随机生成起点 y 坐标
int x2 = rand() % image.cols; // 随机生成终点 x 坐标
int y2 = rand() % image.rows; // 随机生成终点 y 坐标
// 随机生成直线的颜色(BGR格式)
cv::Scalar color(rand() % 256, rand() % 256, rand() % 256);
// 随机生成直线的线宽
int thickness = rand() % 5 + 1; // 随机生成1到5之间的整数作为线宽
// 使用随机参数绘制直线
cv::line(image, cv::Point(x1, y1), cv::Point(x2, y2), color, thickness);
// 显示图像窗口并等待按键
cv::imshow("Random Line Drawing", image);
cv::waitKey(0);
return 0;
}
在这个示例中,我们首先创建了一个白色背景的图像,然后使用rand()
函数生成随机的起点和终点坐标、颜色和线宽。然后,使用cv::line
函数绘制了一条随机直线。
请注意,为了生成随机数,包含了<cstdlib>
头文件,并使用rand()
函数来生成随机数。为了获得特定范围的随机整数,我们使用%
操作符和适当的范围来限制生成的随机数。
3.2 绘制随机矩形
效果图:
要在OpenCV中绘制随机矩形,使用随机数生成器来生成随机的矩形参数,然后使用 cv::rectangle
函数绘制矩形。以下是一个示例代码,演示如何绘制随机矩形:
cpp
#include <opencv2/opencv.hpp>
#include <cstdlib> // 包含随机数生成器所需的头文件
int main() {
// 创建一个空白图像
cv::Mat image(400, 600, CV_8UC3, cv::Scalar(255, 255, 255)); // 白色背景
// 随机生成矩形的参数
int x = rand() % image.cols; // 随机生成矩形左上角 x 坐标
int y = rand() % image.rows; // 随机生成矩形左上角 y 坐标
int width = rand() % 200 + 50; // 随机生成宽度,范围在50到250之间
int height = rand() % 150 + 50; // 随机生成高度,范围在50到200之间
// 随机生成矩形的颜色(BGR格式)
cv::Scalar color(rand() % 256, rand() % 256, rand() % 256);
// 随机生成矩形的线宽
int thickness = rand() % 5 + 1; // 随机生成1到5之间的整数作为线宽
// 使用随机参数绘制矩形
cv::Rect rectangle(x, y, width, height);
cv::rectangle(image, rectangle, color, thickness);
// 显示图像窗口并等待按键
cv::imshow("Random Rectangle Drawing", image);
cv::waitKey(0);
return 0;
}
在这个示例中,首先创建了一个白色背景的图像,然后使用 rand()
函数生成随机的矩形参数,包括左上角坐标、宽度、高度、颜色和线宽。然后,使用 cv::rectangle
函数绘制了一个随机矩形。
4 绘制文本并指定字体和大小
效果图:
要在OpenCV中绘制文本并指定字体和大小,可以使用 cv::putText
函数。以下是一个示例代码,演示如何绘制文本并设置字体和大小:
cpp
#include <opencv2/opencv.hpp>
int main() {
// 创建一个空白图像
cv::Mat image(400, 600, CV_8UC3, cv::Scalar(255, 255, 255)); // 白色背景
// 设置文本的字体和大小
int fontFace = cv::FONT_HERSHEY_SIMPLEX; // 字体类型
double fontScale = 2.0; // 字体大小
int thickness = 3; // 文本线宽
// 设置文本的位置和内容
cv::Point textPosition(100, 200); // 文本起始位置
std::string text = "Hello, OpenCV!";
// 设置文本的颜色
cv::Scalar textColor(0, 0, 255); // 红色
// 使用指定的字体、大小、颜色等参数绘制文本
cv::putText(image, text, textPosition, fontFace, fontScale, textColor, thickness);
// 显示图像窗口并等待按键
cv::imshow("Text Drawing", image);
cv::waitKey(0);
return 0;
}
在这个示例中,我们首先创建了一个白色背景的图像,然后使用以下参数设置文本的字体和大小:
fontFace
:字体类型,cv::FONT_HERSHEY_SIMPLEX
是一种常见的字体类型,也可以选择其他字体类型。fontScale
:字体大小,这里设置为2.0,可以根据需要调整。thickness
:文本线宽,用于控制文本的粗细。
然后,设置了文本的位置和内容:
textPosition
:文本起始位置,这里设置为(100, 200)。text
:要绘制的文本内容,这里设置为"Hello, OpenCV!"。
接下来,设置了文本的颜色:
textColor
:文本颜色,这里设置为红色(cv::Scalar(0, 0, 255)
)。
最后,使用 cv::putText
函数在图像上绘制文本,将上述参数传递给函数。这样,就可以绘制带有指定字体和大小的文本在图像上。
5 窗口的创建
效果图:
以下是一个示例代码,演示如何在OpenCV中创建窗口、修改窗口大小、删除窗口以及删除所有窗口:
cpp
#include <opencv2/opencv.hpp>
int main() {
// 创建一个窗口并指定标题
cv::namedWindow("My Window", cv::WINDOW_AUTOSIZE);
// 等待一段时间
cv::waitKey(2000); // 等待2秒钟
// 修改窗口大小为900x400像素
cv::resizeWindow("My Window", 900, 400);
// 等待一段时间
cv::waitKey(2000); // 等待2秒钟
// 删除窗口
cv::destroyWindow("My Window");
// 等待一段时间
cv::waitKey(2000); // 等待2秒钟
// 创建一个新窗口并指定标题
cv::namedWindow("Another Window", cv::WINDOW_AUTOSIZE);
// 等待一段时间
cv::waitKey(2000); // 等待2秒钟
// 删除所有窗口
cv::destroyAllWindows();
return 0;
}
在这个示例中,首先使用 cv::namedWindow
创建一个名为 "My Window" 的窗口,并使用 cv::WINDOW_AUTOSIZE
模式,使窗口自动调整大小以适应内容。然后,我们使用 cv::waitKey
函数等待2秒钟,以使窗口保持打开状态。
接下来,使用 cv::resizeWindow
函数将窗口大小修改为900x400像素,并再次等待2秒钟。
然后,使用 cv::destroyWindow
函数删除名为 "My Window" 的窗口。
接着,创建了一个新窗口 "Another Window",并等待2秒钟。
最后,使用 cv::destroyAllWindows
函数删除所有窗口。
源代码:(欢迎star)
OpenCV基础(二):绘制直线、绘制几何图形、绘制文字、创建窗口