opencv图片绘制图形-------c++

ops/2024/10/18 19:27:57/

绘制图形

#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <filesystem>bool opencvTool::drawPolygon(std::string image_p, std::vector<cv::Point> points)
{cv::Mat ima = cv::imread(image_p.c_str()); // 读取图像,替换为你的图片路径  cv::Scalar red = cv::Scalar(0, 0, 255);  // Red color  cv::Scalar blue = cv::Scalar(255, 0, 0);  // Red color  int thickness = 2;// 使用polylines函数给图片绘制多边形cv::polylines(ima, points, true, red, thickness, 8, 0);// 填充颜色cv::fillPoly(ima, std::vector<std::vector<cv::Point>>{points}, blue, 8, 0);cv::imwrite(image_p.c_str(), ima);return true;
}bool opencvTool::drawPolygon(cv::Mat& image, std::vector<cv::Point> points, int lineWidth)
{if (image.empty()){std::cout << "Error: empty mat" << std::endl;return false;}// 确保多边形点的数量大于等于3if (points.size() < 3){std::cout << "Error: need at least 3 points to draw a polygon" << std::endl;return false;}// 绘制多边形cv::polylines(image, points, true, cv::Scalar(0, 0, 255), lineWidth);return true;
}

在这里插入图片描述

    // 在图像上绘制多边形并设置线条宽度static bool drawPolygon(cv::Mat& image, std::vector<cv::Point> points, int lineWidth = 1){if (image.empty()){std::cout << "Error: empty mat" << std::endl;return false;}// 确保多边形点的数量大于等于3if (points.size() < 3){std::cout << "Error: need at least 3 points to draw a polygon" << std::endl;return false;}// 将多边形点转换为 OpenCV 的 Point 数组cv::Point *pts = new cv::Point[points.size()];for (size_t i = 0; i < points.size(); ++i){pts[i] = points[i];}// 绘制多边形const cv::Point* ppt[1] = { pts };int npt[] = { static_cast<int>(points.size()) };cv::polylines(image, ppt, npt, 1, true, cv::Scalar(255, 255, 255), lineWidth);delete[] pts;return true;}
  1. cv::Point *pts = new cv::Point[points.size()];: 这行代码创建了一个动态分配的 cv::Point 数组,数组的大小等于传入的顶点数量 points.size()。这个数组将用于存储多边形的顶点坐标。
  2. for (size_t i = 0; i < points.size(); ++i): 这是一个 for 循环,用于遍历传入的顶点向量 points 中的每个顶点。
  3. pts[i] = points[i];: 在循环中,我们将每个顶点 points[i] 的坐标赋值给 pts 数组中对应位置的 cv::Point 对象。
  4. const cv::Point* ppt[1] = { pts };: 这里创建了一个指针数组 ppt,其中包含一个指针指向我们刚刚创建的 pts 数组。这是为了满足 polylines 函数的参数要求,因为该函数期望一个指向多边形顶点数组的指针数组。
  5. int npt[] = { static_cast<int>(points.size()) };: 这里创建了一个整数数组 npt,其中包含一个整数,即多边形顶点的数量。同样,这是为了符合 polylines 函数的参数规范。
  6. cv::polylines(image, ppt, npt, 1, true, cv::Scalar(255, 255, 255), lineWidth);: 最后,这行代码调用了 OpenCV 的 polylines 函数来绘制多边形。它接受图像 image、多边形顶点指针数组 ppt、多边形顶点数量数组 npt、线条段数(这里是1表示绘制完整的多边形)、是否封闭多边形(true 表示封闭)、线条颜色(这里是白色,cv::Scalar(255, 255, 255))、以及线条宽度(lineWidth)作为参数。
  7. delete[] pts;: 最后,我们释放动态分配的 pts 数组的内存,以防止内存泄漏。

http://www.ppmy.cn/ops/21101.html

相关文章

在Docker中为Nginx容器添加多端口映射的详细指南

Nginx作为一款高性能的HTTP和反向代理服务器&#xff0c;常被用于处理网站流量、负载均衡以及反向代理等多种场景。在Docker环境中部署Nginx时&#xff0c;灵活地配置端口映射是确保服务正常运行的关键步骤之一。本文将深入探讨如何在启动Nginx Docker容器时&#xff0c;通过Do…

[linux网络编程]UDP协议和TCP协议的使用

目录 看以下内容前&#xff0c;你要先了解main函数带参数有什么用、 了解socket的相关函数接口 如果不了解socket的相关函数接口请先看我这篇文章 main函数带参数有什么用 UDP udp_server 1.生成socket文件描述符 2.填充sockaddr_in信息 3.bind 4.发&#xff08;收&…

刷题之Leetcode242题(超级详细)

242.有效的字母异位词 力扣题目链接(opens new window)https://leetcode.cn/problems/valid-anagram/ 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s "anagram", t "nagaram" 输出: true 示例 2…

三勾点餐系统,到店点餐,到店自取,开源点餐

“您着急的话可以扫码点餐&#xff0c;点好后凭取餐码取餐呢。”现在生活中去餐馆都能听到这样的一句话&#xff0c;扫码点餐小程序现在很多餐厅、奶茶店、火锅店等都有的一个功能&#xff0c;即方便了顾客&#xff0c;也为商家带来了许多便利。 扫码点餐越来越常见&#…

图论——基础概念

文章目录 学习引言什么是图图的一些定义和概念图的存储方式二维数组邻接矩阵存储优缺点 数组模拟邻接表存储优缺点 边集数组优缺点排序前向星优缺点链式前向星优缺点 学习引言 图论&#xff0c;是 C 里面很重要的一种算法&#xff0c;今天&#xff0c;就让我们一起来了解一下图…

vue3.0(三) Vite文件目录结构及SFC语法

文章目录 Vite介绍Vite文件目录结构SFC语法SFC 语法定义bug解决 Vite介绍 为什么使用Vite&#xff1f; 表现 与Vite的ESbuild预绑定使其比使用任何其他JS绑定器都快10到100倍。这是因为它有助于提高页面速度并将CommonJS/UMD模块转换为ESM。 基于Vite文件&#xff0c;“预绑定…

NDK 基础(一)—— C 语言知识汇总

本系列文章主要是介绍一些 NDK 开发所需的基础知识&#xff0c;目录如下&#xff1a; NDK 基础&#xff08;一&#xff09;—— C 语言知识汇总 NDK 基础&#xff08;二&#xff09;—— C 语言基础与特性1 NDK 基础&#xff08;三&#xff09;—— C 语言基础与特性2 NDK 基础…

六西格玛管理培训:初学者能收获哪些实用知识?

在瞬息万变的商业舞台上&#xff0c;卓越运营管理和持续改进成为企业稳固市场地位、保持竞争优势的关键。六西格玛管理&#xff0c;这把打开高质量之门的金钥匙&#xff0c;正受到越来越多追求卓越的企业的热烈追捧。对于刚刚涉足这一领域的初学者&#xff0c;参与六西格玛管理…