【Opencv】cv::rectangle、cv::getTextSize、cv::putText、cv::Rect函数详解和示例

本文通过原理详解和示例说明,对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设置大小和文本起始点的原因。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
OpenCV提供了一个名为ZBar的二维码识别库,可以用于Python语言进行二维码识别。以下是基于OpenCV和ZBar的多个二维码检测和识别的示例代码。 首先,您需要安装必要的库。可以使用以下命令安装OpenCV和ZBar: ``` pip install opencv-python pip install pyzbar ``` 接下来,您可以使用以下代码来检测和识别多个二维码: ``` python import cv2 from pyzbar import pyzbar # 读取图像 image = cv2.imread("test.jpg") # 转为灰度图像 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 使用ZBar库检测二维码 barcodes = pyzbar.decode(gray) # 循环检测到的二维码 for barcode in barcodes: # 提取二维码的边界框 (x, y, w, h) = barcode.rect # 将边界框绘制到图像上 cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2) # 提取二维码的数据 barcodeData = barcode.data.decode("utf-8") barcodeType = barcode.type # 在图像上绘制二维码数据和类型 text = "{} ({})".format(barcodeData, barcodeType) cv2.putText(image, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) # 显示图像 cv2.imshow("Image", image) cv2.waitKey(0) ``` 在这个示例中,我们首先使用OpenCV读取图像,并将其转换为灰度图像。然后,我们使用ZBar库检测二维码,并循环检测到的二维码。对于每个检测到的二维码,我们提取其边界框并将其绘制到图像上。然后,我们提取二维码的数据和类型,并将其绘制到图像上。最后,我们显示图像并等待用户按下任意键来关闭窗口。 请注意,使用这种方法可以在图像中检测到多个二维码。如果您只想检测一个二维码,可以在检测到第一个二维码后退出循环。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木彳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值