本文通过原理详解和示例说明,对cv::rectangle、cv::getTextSize、cv::putText、cv::Rect函数进行了详细的解读,有助于读者的理解和使用。
cv::Rect ()
cv::Rect 是 OpenCV 库中的一个数据结构,用于表示矩形区域。它包含四个属性:左上角坐标(x,y)和矩形的宽度、高度。
下面是 cv::Rect 的构造函数和使用示例:
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
// 创建一个 cv::Rect 对象,指定左上角坐标 (50, 50) 和宽度、高度 (100, 100)
Rect rect(50, 50, 100, 100);
// 显示矩形区域的坐标和大小
std::cout << "Rect: (" << rect.x << ", " << rect.y << "), Size: (" << rect.width << ", " << rect.height << ")" << std::endl;
return 0;
}
在上面的示例中,我们使用 cv::Rect 的构造函数创建了一个矩形区域,其中左上角坐标为 (50, 50),宽度为 100,高度为 100。然后,我们通过访问 cv::Rect 对象的属性来获取矩形区域的坐标和大小,并将其打印到控制台上。
除了构造函数之外,cv::Rect 还提供了一些常用的方法,如 x、y、width 和 height,用于获取和设置矩形区域的属性。此外,还可以使用 cv::Rect 进行比较运算(如相等、包含)和数学运算(如加法、减法)。
cv::rectangle()
cv::rectangle() 是 OpenCV 库中的一个函数,用于在图像上绘制矩形。它接受以下参数:
img:输入图像,可以是彩色或灰度图像。
r:矩形的位置和大小。它是一个 cv::Rect 对象,包含左上角坐标(x,y)和宽度、高度。
color:矩形的颜色。通常使用 BGR 格式的 cv::Scalar 对象表示。
thickness:线条的厚度。如果为负数,则会填充矩形。
下面是一个示例代码:
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat img = imread("image.jpg");
if (img.empty())
{
std::cout << "Could not read the image." << std::endl;
return -1;
}
Rect r(50, 50, 100, 100); // 定义矩形位置和大小
Scalar color = Scalar(0, 255, 0); // 定义矩形颜色(绿色)
int thickness = 2; // 定义线条粗细
// 在图像上绘制矩形
rectangle(img, r, color, thickness);
// 显示图像
imshow("Rectangle", img);
waitKey(0);
return 0;
}
在上面的示例中,我们首先读取一张图像,并检查是否成功读取。然后,我们定义一个 cv::Rect 对象来指定矩形的位置和大小。接着,我们使用 cv::Scalar 对象定义矩形的颜色(这里选择了绿色),并指定线条的粗细。最后,我们调用 cv::rectangle() 函数在图像上绘制矩形,并通过 imshow() 和 waitKey() 显示图像。
cv::putText()
cv::putText() 是 OpenCV 库中的一个函数,用于在图像上绘制文本。下面是函数的详细说明:
函数原型:
void cv::putText(Mat& img, const String& text, Point org, int fontFace, double fontScale, Scalar color, int thickness = 1, int lineType = 8, bool bottomLeftOrigin = false)
参数解释:
img:要在其上绘制文本的图像。
text:要绘制的文本字符串。
org:文本的起始位置。
fontFace:字体类型,可以使用 FONT_HERSHEY_SIMPLEX、FONT_HERSHEY_PLAIN、FONT_HERSHEY_DUPLEX 等常量。
fontScale:字体缩放比例。
color:文本颜色,可以使用 Scalar 对象表示。
thickness:线条粗细,默认为1。
lineType:线条类型,默认为8(实线)。
bottomLeftOrigin:是否按照左下角作为坐标原点,默认为false(左上角作为原点)。
示例代码:
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat image = imread("image.jpg");
String text = "Hello, OpenCV!"; // 要绘制的文本字符串
Point org(10, 50); // 文本起始位置
Scalar color(0, 255, 0); // 文本颜色(BGR)
int thickness = 2; // 线条粗细
int fontFace = FONT_HERSHEY_SIMPLEX; // 字体类型
double fontScale = 1; // 字体缩放比例
// 在图像上绘制文本
cv::putText(image, text, org, fontFace, fontScale, color, thickness);
// 显示图像
cv::imshow("Text Example", image);
cv::imwrite("image1.jpg", image);
cv::waitKey(0);
return 0;
}
在上面的示例中,我们加载一幅图像,并定义了要绘制的文本字符串、起始位置、颜色、线条粗细、字体类型和字体缩放比例。然后,我们使用 cv::putText() 函数在图像上绘制文本。最后,我们显示图像并等待用户按下任意键退出程序。
cv::getTextSize()
cv::getTextSize() 函数用于计算文本在图像中的大小。它接受文本字符串、字体、字体大小、线条粗细等参数,并返回一个 cv::Size 对象,表示文本的宽度和高度。这个函数可以帮助我们确定文本在图像中的位置和大小,以便我们可以在正确的位置绘制文本。
示例代码:
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace cv;
int main() {
cv::Mat image = imread("image.jpg");
cv::Scalar color(0, 0, 255); // 设置颜色为红色
int fontFace = cv::FONT_HERSHEY_SIMPLEX; // 使用Hershey Simplex字体
double fontScale = 1; // 字体缩放比例为1
int thickness = 2; // 设置文本线的厚度为2
std::string text = "Hello, OpenCV!"; // 需要测量大小的文本字符串
// 获取文本大小
cv::Size size = cv::getTextSize(text, fontFace, fontScale, thickness,NULL);
std::cout << "Text size: (" << size.width << ", " << size.height << ")" << std::endl; // 打印文本大小
// 在图像上绘制文本
cv::putText(image, text, cv::Point(100- size.width, 100- size.height), fontFace, fontScale, color, thickness);
image.convertTo(image, CV_8U); // 转换为8位无符号整数(即CV_8U)以显示图像
cv::imshow("Image with text", image); // 显示图像
cv::waitKey(0); // 等待用户按键,0表示无限等待
cv::imwrite("image1.jpg", image);
return 0;
}
在上面的示例中,我们通过cv::getTextSize()函数获得了相应的宽高尺寸,在把文本放上去的时候,结合Size的尺寸,结果如上图所示,一部分文字无法加在图像上。这就是Size设置大小和文本起始点的原因。