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

news/2025/1/19 4:01:42/

绘制图形

#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/news/1441845.html

相关文章

Linux下基于Electron的ZeroTier客户端GUI

Linux下基于Electron的ZeroTier客户端GUI 起因 在使用Zerotier组网的时候&#xff0c;我发现官方客户端GUI只有Windows版本和MacOS版本的&#xff0c;在Linux下加入网络等操作依然要靠命令实现&#xff0c;因此我干脆自己动手写了个GUI&#xff0c;其原理还是通过调用命令实现…

springboot+Vue实现分页

文章目录 一、后端二、前端 今天开发的有一个场景就是需要从远程ssh服务器上加载一个文件展示到前端&#xff0c;但是一次性拉过来有几万条数据&#xff0c;一下载加载整个文件会导致前端非常非常的卡&#xff0c;于是要使用分页解决&#xff0c;我之前看过的有mybatis的分页查…

【信号处理】基于CNN自编码器的心电信号异常检测识别(tensorflow)

关于 本项目主要实现卷积自编码器对于异常心电ECG信号的检测和识别&#xff0c;属于无监督学习中的生理信号检测的典型方法之一。 工具 方法实现 读取心电信号 normal_df pd.read_csv("/heartbeat/ptbdb_normal.csv").iloc[:, :-1] anomaly_df pd.read_csv(&quo…

Spring Boot 的文件配置

SpringBoot的配置文件,有三种格式 1.properties 2.yaml 3.yml(yaml的简写) 这里主要介绍1和3格式的。 在项目中,同时存在properties和yml配置文件, properties的优先级更高 同时存在时,两个文件都生效 如果两个文件中,都包含同一个配置,以properties为主。 properties的配置…

Python爬虫--Ajax异步抓取腾讯视频评论

在某些网站 &#xff0c;当我们滑下去的时候才会显示出后面的内容 就像淘宝一样&#xff0c;滑下去才逐渐显示其他商品 这个就是采用 Ajax 做的 然后我们现在就是要编写这样的爬虫。 规律分析&#xff1a; 这个时候就要用到我们的 Fiddler 了 我们需要分析加载评论的规律 …

PotatoPie 4.0 实验教程(21) —— FPGA实现摄像头图像二值化(RGB2Gray2Bin)

PotatoPie 4.0开发板教程目录&#xff08;2024/04/21&#xff09; 为什么要进行图像的二值化&#xff1f; 当我们处理图像时&#xff0c;常常需要将其转换为二值图像。这是因为在很多应用中&#xff0c;我们只对图像中的某些特定部分感兴趣&#xff0c;而不需要考虑所有像素的…

引入线程的贪吃蛇风骚走位

1.在main函数中分别引入线程t1 和线程 t2 一个线程用来刷新界面&#xff0c;一个线程用来改变方向 2.刷新界面函数&#xff0c;无限次刷新 3. 也是无限循环while(1) 定义key 从键盘获取输入方向&#xff0c;赋值给dir; 4.在初始化函数中确定蛇向有行走为方向 5.从改变方向的函数…

计算机网络复习(第一章概述)

一、基本概念 1、计算机网络&#xff1a;由若干节点和连接这些结点的链路组成&#xff08;交换机连接&#xff09; 2、互连网&#xff1a;路由器连接的多个计算机网络 3、ISP&#xff1a;互联网服务提供商&#xff0c;ISP高级路由器连接全部组成互联网 4、互联网必须使用TC…