opencv中绘制图像的函数

常用函数简介

OpenCV 中用于绘制不同图形的 C++ 函数的简要介绍:

  1. 绘制矩形框:

    复制代码
    cv::rectangle(image, cv::Point pt1, cv::Point pt2, cv::Scalar color, int thickness);
    • image:目标图像
    • pt1 和 pt2:矩形的对角线顶点坐标
    • color:矩形的颜色
    • thickness:线条的粗细,如果为负数,表示填充矩形
  2. 绘制文字:

    复制代码
    cv::putText(image, text, cv::Point org, int fontFace, double fontScale, cv::Scalar color, int thickness);
    • image:目标图像
    • text:要绘制的文本
    • org:文本的起始坐标
    • fontFace:字体类型
    • fontScale:字体缩放因子
    • color:文本颜色
    • thickness:线条的粗细
  3. 绘制圆:

    复制代码
    cv::circle(image, cv::Point center, int radius, cv::Scalar color, int thickness);
    • image:目标图像
    • center:圆心坐标
    • radius:半径
    • color:圆的颜色
    • thickness:线条的粗细,如果为负数,表示填充圆
  4. 绘制椭圆:

    复制代码
    cv::ellipse(image, cv::Point center, cv::Size axes, double angle, double startAngle, double endAngle, cv::Scalar color, int thickness);
    • image:目标图像
    • center:椭圆中心坐标
    • axes:长轴和短轴的大小
    • angle:椭圆旋转角度
    • startAngle 和 endAngle:椭圆的起始和结束角度
    • color:椭圆的颜色
    • thickness:线条的粗细,如果为负数,表示填充椭圆
  5. 绘制线段:

    复制代码
    cv::line(image, cv::Point pt1, cv::Point pt2, cv::Scalar color, int thickness);
    • image:目标图像
    • pt1 和 pt2:线段的起点和终点坐标
    • color:线段的颜色
    • thickness:线条的粗细
  6. 绘制多边形:

    复制代码
    cv::polylines(image, std::vector<std::vector<cv::Point>> contours, bool isClosed, cv::Scalar color, int thickness);
    • image:目标图像
    • contours:多边形的顶点坐标
    • isClosed:是否封闭多边形
    • color:多边形的颜色
    • thickness:线条的粗细
  7. 绘制填充多边形:

    复制代码
    cv::fillPoly(image, std::vector<std::vector<cv::Point>> contours, cv::Scalar color);
    • image:目标图像
    • contours:多边形的顶点坐标
    • color:填充颜色
  8. 绘制箭头:

    复制代码
    cv::arrowedLine(image, cv::Point pt1, cv::Point pt2, cv::Scalar color, int thickness, int line_type, int tipLength);
    • image:目标图像
    • pt1 和 pt2:箭头的起点和终点坐标
    • color:箭头的颜色
    • thickness:线条的粗细
    • line_type:线条的类型
    • tipLength:箭头的尖端长度

测试例子

在C++中使用OpenCV库可以轻松实现在图像上绘制矩形框、文字、圆、椭圆、线段、多边形等各种图形和操作。以下是一些示例代码来演示如何在图像上执行这些操作:

复制代码
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

int main() {
    // 创建一个空白图像
    cv::Mat image = cv::Mat::zeros(400, 400, CV_8UC3);

    // 在图像上绘制矩形框
    cv::rectangle(image, cv::Point(50, 50), cv::Point(150, 150), cv::Scalar(0, 0, 255), 2);

    // 在图像上绘制文字
    cv::putText(image, "OpenCV", cv::Point(160, 180), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255, 255, 255), 2);

    // 在图像上绘制圆
    cv::circle(image, cv::Point(200, 200), 50, cv::Scalar(0, 255, 0), 2);

    // 在图像上绘制椭圆
    cv::ellipse(image, cv::Point(300, 300), cv::Size(60, 40), 45, 0, 360, cv::Scalar(255, 0, 0), 2);

    // 在图像上绘制线段
    cv::line(image, cv::Point(50, 200), cv::Point(150, 300), cv::Scalar(255, 0, 255), 2);

    // 在图像上绘制多边形(五角星)
    std::vector<cv::Point> star_points;
    star_points.push_back(cv::Point(250, 50));
    star_points.push_back(cv::Point(265, 100));
    star_points.push_back(cv::Point(305, 100));
    star_points.push_back(cv::Point(280, 130));
    star_points.push_back(cv::Point(295, 175));
    star_points.push_back(cv::Point(250, 150));
    star_points.push_back(cv::Point(205, 175));
    star_points.push_back(cv::Point(220, 130));
    star_points.push_back(cv::Point(195, 100));
    star_points.push_back(cv::Point(235, 100));
    cv::polylines(image, star_points, true, cv::Scalar(255, 255, 0), 2);

    // 在图像上绘制贝叶斯曲线
    cv::Mat curve_image = cv::Mat::zeros(400, 400, CV_8UC3);
    std::vector<cv::Point> curve_points;
    for (int x = 0; x < curve_image.cols; x++) {
        int y = 200 - static_cast<int>(50 * sin(x * 0.05));
        curve_points.push_back(cv::Point(x, y));
    }
    cv::polylines(curve_image, curve_points, false, cv::Scalar(0, 255, 255), 2);
    
        // 创建一个子图,将子图绘制到图片上
        // 创建子图像(ROI)
        cv::Rect roi_rect(100, 100, 200, 150);  // 在(100, 100)位置创建一个200x150的子图像
        cv::Mat roi = image(roi_rect);

        // 在子图像上绘制一个矩形
        cv::rectangle(roi, cv::Point(20, 20), cv::Point(180, 130), cv::Scalar(0, 0, 255), 2);

        // 在子图像上绘制文字
        cv::putText(roi, "Subimage", cv::Point(40, 40), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255, 255, 255), 2);

    // 显示图像
    cv::imshow("Shapes", image);
    cv::imshow("Sin Curve", curve_image);

    // 等待按键
    cv::waitKey(0);

    return 0;
}

上述示例代码创建了一个400x400的空白图像,然后在图像上绘制矩形框、文字、圆、椭圆、线段和多边形(五角星),以及一个sin曲线 子图。您可以根据需要修改图形的位置、颜色、大小等参数。请确保您的C++项目中已正确包含OpenCV库并已配置编译环境。

相关推荐
hetao17338371 小时前
校内场-提高组 ZYZSC-S-Round 2
c++·算法
萌萌的提莫队长1 小时前
Unity相机捕捉,图像识别,抠像+合成
opencv·unity
hetao17338371 小时前
2026-10-14 hetao1733837 的刷题记录
c++·算法
xingyuzhisuan1 小时前
一文读懂星宇智算 StarVerse-AI 无限画布,AI 视频场景的空间扩展方案
人工智能·计算机视觉
浅念-2 小时前
动态规划:线性DP——多状态DP与子数组专题笔记
c++·笔记·算法·leetcode·职场和发展·动态规划·力扣
晨间晓3 小时前
两张图片哪里不一样?用 OpenCV 做图像差异检测工具
人工智能·opencv·计算机视觉
波力海苔夹心脆6755 小时前
VisionPro 与 VisionMaster 对比(上):软件定位、开发环境与核心视觉工具对照
图像处理·算法·计算机视觉·c#·视觉检测·个人开发·vp9
richard_yuu5 小时前
OpenCV 实战第 13 篇:工程化收尾,内存拷贝、并行与一条完整流水线
人工智能·opencv·计算机视觉
晨间晓5 小时前
图片拍歪了怎么办?用华为云码道开发 OpenCV 自动纠偏工具
人工智能·opencv·华为云
语音之家5 小时前
多模态模型的“思考”方式:视觉、通用音频与语音的 CoT 技术路线
人工智能·计算机视觉·语言模型·visual cot