首页 > 其他分享 >OpenCV中绘制多边形的函数:fillPoly与polylines

OpenCV中绘制多边形的函数:fillPoly与polylines

时间:2024-06-17 13:21:54浏览次数:17  
标签:triangle img Point int fillPoly quadrilateral OpenCV polylines cv

一 、函数接口介绍

1.1 fillPoly函数

这是个重载函数,有2个实现,具体如下:
1、重载1

void fillPoly(Mat& img, 
              const Point** pts, 
              const int* npts, 
              int ncontours, 
              const Scalar& color, 
              int lineType=8, 
              int shift=0, 
              Point offset=Point()
            );
/*
*img:待绘制的图像
*pts:多边形数组指针,比如Point p[2][5]表示2个轮廓,每个轮廓由5个点组成
*npts:每一个多边形顶点个数的数组,比如int n[] = {5, 5};
*ncontours:要绘制多边形的个数
*color:颜色
*lineType:边界线条颜色
*shift:顶点坐标小数点的位数
*offset:所有顶点的偏移量
*/

2、重载2

void cv::fillPoly (InputOutputArray img,
                   InputArrayOfArrays pts, 
                   const Scalar & color,
                   int lineType = LINE_8,
                   int shift = 0,
                   Point offset = Point()
) 
/*
*img:Mat类型的待绘制图像
*pts:指std::vector<std::vectorcv::Point>类型
*/

1.2 polylines函数

这个与fillPoly区别在于它只绘制边界线,也是重载函数,有2个实现,具体如下
1、重载1

void cv::polylines (InputOutputArray img,
                    const Point *const *  pts, 
                    const int * npts,
                    int ncontours,
                    bool isClosed,
                    const Scalar & color, 
                    int thickness = 1,
                    int lineType = LINE_8,
                    int shift = 0
)
/*
*isClosed:是否是封闭曲线的标志位,即首尾是否要相连
*/

2、重载2

void cv::polylines (InputOutputArray img,
                    InputArrayOfArrays pts,
                    bool isClosed,
                    const Scalar color,
                    int thickness = 1,
                    int lineType = LINE_8,
                    int shift = 0
) 

二、代码演示

2.1 fillPoly函数

1、重载1

#include <opencv2/opencv.hpp>

int main() {
    // 创建一个黑色图像
    cv::Mat img = cv::Mat::zeros(500, 500, CV_8UC3);

    // 定义第一个多边形(三角形)
    cv::Point triangle[3];
    triangle[0] = cv::Point(100, 100);
    triangle[1] = cv::Point(200, 100);
    triangle[2] = cv::Point(150, 200);

    // 定义第二个多边形(四边形)
    cv::Point quadrilateral[4];
    quadrilateral[0] = cv::Point(300, 300);
    quadrilateral[1] = cv::Point(400, 300);
    quadrilateral[2] = cv::Point(400, 400);
    quadrilateral[3] = cv::Point(300, 400);

    // 多边形顶点数组
    const cv::Point* pts[2] = { triangle, quadrilateral };
    // 每个多边形的顶点数量
    int npts[2] = { 3, 4 };

    // 使用 fillPoly 在图像上填充多边形
    cv::fillPoly(img, pts, npts, 2, cv::Scalar(0, 255, 0), cv::LINE_8);

    // 显示结果
    cv::imshow("Polygons", img);
    cv::waitKey(0);

    return 0;
}

2、重载2

#include <opencv2/opencv.hpp>
#include <vector>

int main() {
    // Create a black image
    cv::Mat img = cv::Mat::zeros(500, 500, CV_8UC3);

    // Define the first polygon (a triangle)
    std::vector<cv::Point> triangle;
    triangle.push_back(cv::Point(100, 100));
    triangle.push_back(cv::Point(200, 100));
    triangle.push_back(cv::Point(150, 200));

    // Define the second polygon (a quadrilateral)
    std::vector<cv::Point> quadrilateral;
    quadrilateral.push_back(cv::Point(300, 300));
    quadrilateral.push_back(cv::Point(400, 300));
    quadrilateral.push_back(cv::Point(400, 400));
    quadrilateral.push_back(cv::Point(300, 400));

    // Combine the polygons into a single vector of vectors
    std::vector<std::vector<cv::Point>> polygons;
    polygons.push_back(triangle);
    polygons.push_back(quadrilateral);

    // Use fillPoly to fill the polygons on the image
    cv::fillPoly(img, polygons, cv::Scalar(0, 255, 0), cv::LINE_8);

    // Display the result
    cv::imshow("Polygons", img);
    cv::waitKey(0);

    return 0;
}

2.2 polylines函数

1、重载1

#include <opencv2/opencv.hpp>

int main() {
    // 创建一个黑色图像
    cv::Mat img = cv::Mat::zeros(500, 500, CV_8UC3);

    // 定义第一个多边形(三角形)
    cv::Point triangle[3];
    triangle[0] = cv::Point(100, 100);
    triangle[1] = cv::Point(200, 100);
    triangle[2] = cv::Point(150, 200);

    // 定义第二个多边形(四边形)
    cv::Point quadrilateral[4];
    quadrilateral[0] = cv::Point(300, 300);
    quadrilateral[1] = cv::Point(400, 300);
    quadrilateral[2] = cv::Point(400, 400);
    quadrilateral[3] = cv::Point(300, 400);

    // 多边形顶点数组
    const cv::Point* pts[2] = { triangle, quadrilateral };
    // 每个多边形的顶点数量
    int npts[2] = { 3, 4 };

    // 使用 polylines 在图像上绘制多边形边框
    cv::polylines(img, pts, npts, 2, true, cv::Scalar(0, 255, 0), 2, cv::LINE_8);

    // 显示结果
    cv::imshow("Polylines", img);
    cv::waitKey(0);

    return 0;
}

2、重载2

#include <opencv2/opencv.hpp>
#include <vector>

int main() {
    // 创建一个黑色图像
    cv::Mat img = cv::Mat::zeros(500, 500, CV_8UC3);

    // 定义第一个多边形(三角形)
    std::vector<cv::Point> triangle;
    triangle.push_back(cv::Point(100, 100));
    triangle.push_back(cv::Point(200, 100));
    triangle.push_back(cv::Point(150, 200));

    // 定义第二个多边形(四边形)
    std::vector<cv::Point> quadrilateral;
    quadrilateral.push_back(cv::Point(300, 300));
    quadrilateral.push_back(cv::Point(400, 300));
    quadrilateral.push_back(cv::Point(400, 400));
    quadrilateral.push_back(cv::Point(300, 400));

    // 将多边形组合到一个矢量的矢量中
    std::vector<std::vector<cv::Point>> polygons;
    polygons.push_back(triangle);
    polygons.push_back(quadrilateral);

    // 使用 polylines 在图像上绘制多边形边框
    cv::polylines(img, polygons, true, cv::Scalar(0, 255, 0), 2, cv::LINE_8);

    // 显示结果
    cv::imshow("Polylines", img);
    cv::waitKey(0);

    return 0;
}

标签:triangle,img,Point,int,fillPoly,quadrilateral,OpenCV,polylines,cv
From: https://www.cnblogs.com/Terrypython/p/18251734

相关文章

  • OpenCV 根据 URL 读取网络图片
    OpenCV 提供了一个 imread() 函数可以在本地磁盘读取图片并进行各种操作,这里介绍一种方法,可以让OpenCV根据URL也能读取网络图片(配合Nginx服务更好用)参考链接:【Python】根据URL读取网络图片的两种方式(OpenCV)_cv2读取网络图片-CSDN博客 调用 VideoCapture 进行转换im......
  • 树莓派4B_OpenCv学习笔记9:图片的腐蚀与膨胀
    今日继续学习树莓派4B4G:(RaspberryPi,简称RPi或RasPi) 本人所用树莓派4B装载的系统与版本如下: 版本可用命令(lsb_release-a)查询: Opencv版本是4.5.1:图像的膨胀与腐蚀一般用于灰度图或者二值图,今日便来学习一下文章提供测试代码讲解,整体代码贴出、测试效果图......
  • OpenCV 双目三角法计算点云
    文章目录一、简介二、实现代码三、实现效果参考资料一、简介基于三角法计算点坐标的过程类似于我们人类眼睛观察事物的过程:如上图所示,通过两个相机观察到同一位置,我们可以通过两个相机得到这一位置的投影坐标(ur,vr),(ul,vl)......
  • OpenCV 形态学操作
    canny边缘检测        canny边缘检测算法是JohnF.Canny于1986年开发出来的一个多边缘检测算法,也被很多人认为是边缘检测的最优算法,最优边缘检测的三个主要标准是:        低错误率:标识出尽可能多的实际边缘,同时尽可能的减少噪声产生的误报。       ......
  • 基于Python+OpenCV的车牌识别停车场管理系统(PyQt界面)【含Python源码 MX_009期】
    简介:        基于Python和OpenCV的车牌识别停车场管理系统是一种利用计算机视觉技术来自动识别停车场进出车辆的系统。该系统通过摄像头捕获车辆图像,并使用OpenCV库中的图像处理和模式识别技术来识别图像中的车牌号码。一旦车牌被成功识别,系统就会将车辆的进出时间和......
  • C# OpenCvSharp Mat操作-操作符重载
    在C#中使用OpenCvSharp进行图像处理时,操作符重载可以使代码更加简洁和直观。下面是对每个操作符的详细解释及示例代码。“+”运算符作用或原理:+运算符可以在Mat与Mat之间进行,也可以在Mat和一个数字之间进行加运算。使用加运算可以改变图像亮度,也可以实现两幅图像......
  • 树莓派4B_OpenCv学习笔记6:OpenCv识别已知颜色_运用掩膜
    今日继续学习树莓派4B4G:(RaspberryPi,简称RPi或RasPi) 本人所用树莓派4B装载的系统与版本如下: 版本可用命令(lsb_release-a)查询: Opencv版本是4.5.1:学了这些OpenCv的理论性知识,不进行实践实在是太无聊了,今天就尝试使用OpenCv,已知颜色信息,来识别一张图片的颜色......
  • 【Python】使用OpenCV特征匹配检测图像中的【特定水印】
    如果没有方向往哪里走都是前方做自己的光不需要多亮曾受过的伤会长出翅膀大雨冲刷过的天空会更加明亮流过泪的眼睛也一样做自己的光悄悄的发亮逆风的方向更容易飞翔世界怎样在于你凝视它的目光那未曾谋面过的远方或许就在身旁              ......
  • OpenCV实战案例——直线检测[C++]
    0.前言本文以实战案例为背景,一步步讲述如何使用计算机图像处理相关知识提取图片中英语填空题答题线。1.需求背景某公司打算设计一款英语题目批改APP,要求学生上传英语填空题图片,然后该APP自动标注答题线位置(使用红线标注),方便后续定位和批改答案。下图(图1-1)为某一学生上传的......
  • OpenCV实战案例——校正+切边[C++]
    0.前言本文以实战案例为背景,讲述如何使用计算机图形学知识完成需求,实现最终效果。本文包含实战案例素材以及过程代码讲解,方便读者理解。1.案例需求某公司打算开发一款用于提取学生作业本的程序,学生用手机拍摄自己的作业上传到程序,程序进行处理最终提取出作业本区域方便老师批改......