返回顶部
首页 > 资讯 > 精选 >怎么用OpenCV绘制图形功能
  • 188
分享到

怎么用OpenCV绘制图形功能

2023-06-26 06:06:31 188人浏览 独家记忆
摘要

这篇文章主要介绍“怎么用OpenCV绘制图形功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用OpenCV绘制图形功能”文章能帮助大家解决问题。1、绘制直线绘制直线函数是cv::line,函数

这篇文章主要介绍“怎么用OpenCV绘制图形功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用OpenCV绘制图形功能”文章能帮助大家解决问题。

1、绘制直线

绘制直线函数是cv::line,函数完整形式如下

void line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0);

color可以使用cv::Scalar构造,但是传入参数的顺序是BGR,使用CV_RGB宏更直观,以RGB顺序传入;

lineType取值有LINE_4、LINE_8和LINE_AA,分别表示4连接线,8连接线,抗锯齿线,是以不同的算法产生直线(也可以是FILLED=-1,直接填充);

shift是指点坐标的二进制表示的位偏移,每加1坐标值减一半,实验的结果,不知道理解的对不对,使用默认值0就可以了;

在两个点之间绘制线宽为1的红色直线定义为一个函数

void DrawLine(const cv::Mat& destImg, const cv::Point& pt1, const cv::Point& pt2){    cv::line(destImg, pt1, pt2, CV_RGB(255, 0, 0), 1);}

下面的实例在鼠标两次点击位置中间画一根直线,绘制完成可以按Enter键保存图像。

cv::Mat g_originImage;//原始图像cv::Mat g_editImage;//编辑的图像std::vector<cv::Point> g_editPoints;//正在绘制的图形的点std::vector<std::vector<cv::Point>> g_lines;//所有的线段 void RedrawAllLines(){    g_originImage.copyTo(g_editImage);//恢复背景图像    for (int i = 0; i < g_lines.size(); i++)    {        if (g_lines[i].size() >= 2)        {            DrawLine(g_editImage,g_lines[i][0], g_lines[i][1]);        }    }}void OnDrawLineMouseEvent(int event, int x, int y, int flags, void* userdata){    if (event == cv::EVENT_LBUTTONDOWN)    {        if (g_editPoints.size() > 0)        {            //在第二个点按下鼠标之后添加到线段列表中,并重绘图像            g_editPoints.push_back(cv::Point(x, y));            g_lines.push_back(g_editPoints);            RedrawAllLines();            g_editPoints.clear();            imshow("image", g_editImage);        }        else        {            g_editPoints.push_back(cv::Point(x, y));//第一个点        }    }    else if (event == cv::EVENT_MOUSEMOVE)    {        if (g_editPoints.size() > 0)        {            //鼠标移动中,绘制到鼠标位置的直线,但鼠标当前点不加入到g_editPoints中            RedrawAllLines();            DrawLine(g_editImage,g_editPoints[g_editPoints.size() - 1], cv::Point(x, y));            imshow("image", g_editImage);        }    }} int main(int arGC, char **arv){    g_originImage = cv::imread("walkers.jpg");    g_originImage.copyTo(g_editImage);    cv::namedWindow("image");    imshow("image", g_editImage);    cv::setMouseCallback("image", OnDrawLineMouseEvent);    int key = cv::waiTKEy(0);    while (key != 27)    {        if (key == 13)        {            cv::imwrite("testsave.png", g_editImage);        }        key = cv::waitKey(0);    }    return 0;}

2、绘制圆

绘制圆的函数cv::circle

void circle(InputOutputArray img, Point center, int radius,const Scalar& color, int thickness = 1,int lineType = LINE_8, int shift = 0);

以两个点画一个圆,第一个点为圆心,两点距离为圆半径,定义为一个函数DrawCircle

void DrawCircle(const cv::Mat& destImg, const cv::Point& pt1, const cv::Point& pt2){    cv::Point deltaPt = pt2 - pt1;    float radius = cv::sqrt(deltaPt.x*deltaPt.x + deltaPt.y*deltaPt.y);    cv::circle(destImg, pt1, radius, CV_RGB(255, 0, 0), 1);}

以下示例实现鼠标点击两次绘制如上的一个圆,main函数与画直线一样,只要将鼠标事件回调改成OnDrawCircleMouseEvent

std::vector<std::vector<cv::Point>> g_circles;//所有的圆 void RedrawAllCircles(){    g_originImage.copyTo(g_editImage);//恢复背景图像    for (int i = 0; i < g_circles.size(); i++)    {        if (g_circles[i].size() >= 2)        {            DrawCircle(g_editImage, g_circles[i][0], g_circles[i][1]);        }    }}void OnDrawCircleMouseEvent(int event, int x, int y, int flags, void* userdata){    if (event == cv::EVENT_LBUTTONDOWN)    {        if (g_editPoints.size() > 0)        {            g_editPoints.push_back(cv::Point(x, y));            g_circles.push_back(g_editPoints);            RedrawAllCircles();            g_editPoints.clear();            imshow("image", g_editImage);        }        else        {            g_editPoints.push_back(cv::Point(x, y));//第一个点        }    }    else if (event == cv::EVENT_MOUSEMOVE)    {        if (g_editPoints.size() > 0)        {            RedrawAllCircles();            DrawCircle(g_editImage, g_editPoints[g_editPoints.size() - 1], cv::Point(x, y));            imshow("image", g_editImage);        }    }}

3、绘制椭圆

绘制椭圆的函数cv::ellipse,有两种形式,其中一个定义如下

void ellipse(InputOutputArray img, const RotatedRect& box, const Scalar& color,int thickness = 1, int lineType = LINE_8);

以两个点组成的矩形内画一个椭圆,定义为函数DrawEllipse,这里不考虑矩形的旋转,固定为0

void DrawEllipse(const cv::Mat& destImg, const cv::Point& pt1, const cv::Point& pt2){    cv::Point2f center = cv::Point2f((pt1.x + pt2.x) / 2.0, (pt1.y + pt2.y) / 2.0);    cv::Point2f size = cv::Point2f(cv::abs(pt2.x - pt1.x), cv::abs(pt2.y - pt1.y));    cv::ellipse(destImg,cv::RotatedRect(center, size, 0),CV_RGB(255, 0, 0), 1);}

以下示例实现在鼠标两次点击位置中间画一个椭圆,main函数与画直线一样,将鼠标事件回调改成OnDrawEllipseMouseEvent

std::vector<std::vector<cv::Point>> g_ellipses;//所有的椭圆void RedrawAllEllipses(){    g_originImage.copyTo(g_editImage);//恢复背景图像    for (int i = 0; i < g_ellipses.size(); i++)    {        if (g_ellipses[i].size() >= 2)        {            DrawEllipse(g_editImage, g_ellipses[i][0], g_ellipses[i][1]);        }    }}void OnDrawEllipseMouseEvent(int event, int x, int y, int flags, void* userdata){    if (event == cv::EVENT_LBUTTONDOWN)    {        if (g_editPoints.size() > 0)        {            g_editPoints.push_back(cv::Point(x, y));            g_ellipses.push_back(g_editPoints);            RedrawAllEllipses();            g_editPoints.clear();            imshow("image", g_editImage);        }        else        {            g_editPoints.push_back(cv::Point(x, y));//第一个点        }    }    else if (event == cv::EVENT_MOUSEMOVE)    {        if (g_editPoints.size() > 0)        {            RedrawAllEllipses();            DrawEllipse(g_editImage, g_editPoints[g_editPoints.size() - 1], cv::Point(x, y));            imshow("image", g_editImage);        }    }}

4、绘制矩形

绘制矩形的函数cv::rectangle,有两种形式,其中一个定义如下

void rectangle(InputOutputArray img, Rect rec,const Scalar& color, int thickness = 1,int lineType = LINE_8, int shift = 0);

在两个点间画一个矩形,定义为函数DrawRectangle

void DrawRectangle(const cv::Mat& destImg, const cv::Point& pt1, const cv::Point& pt2){    cv::rectangle(destImg, cv::Rect(pt1, pt2), CV_RGB(255, 0, 0), 1);}

以下示例实现在鼠标两次点击位置中间画一个矩形,main函数与画直线一样,将鼠标事件回调改成OnDrawRectangleMouseEvent

 std::vector<std::vector<cv::Point>> g_rectangles;//所有的矩形void RedrawAllRectangles(){    g_originImage.copyTo(g_editImage);//恢复背景图像    for (int i = 0; i < g_rectangles.size(); i++)    {        if (g_rectangles[i].size() >= 2)        {            DrawRectangle(g_editImage, g_rectangles[i][0], g_rectangles[i][1]);        }    }}void OnDrawRectangleMouseEvent(int event, int x, int y, int flags, void* userdata){    if (event == cv::EVENT_LBUTTONDOWN)    {        if (g_editPoints.size() > 0)        {            g_editPoints.push_back(cv::Point(x, y));            g_rectangles.push_back(g_editPoints);            RedrawAllRectangles();            g_editPoints.clear();            imshow("image", g_editImage);        }        else        {            g_editPoints.push_back(cv::Point(x, y));//第一个点        }    }    else if (event == cv::EVENT_MOUSEMOVE)    {        if (g_editPoints.size() > 0)        {            RedrawAllRectangles();            DrawRectangle(g_editImage, g_editPoints[g_editPoints.size() - 1], cv::Point(x, y));            imshow("image", g_editImage);        }    }}

5、绘制多边形轮廓

绘制多边形的函数cv::polylines,有两种形式,其中一个定义如下

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

这里的pts是一个2维数组,表示多个多边形,以下分别实现绘制多个多边形和单个多边形的函数

void DrawMultiPolys(const cv::Mat& destImg, const std::vector<std::vector<cv::Point>>& points, bool bClose){    cv::polylines(destImg, points, bClose, CV_RGB(255, 0, 0), 1);}void DrawOnePoly(const cv::Mat& destImg, const std::vector<cv::Point>& points,bool bClose){    if (points.size() >= 2)    {        std::vector<std::vector<cv::Point>> polyPoints;        polyPoints.push_back(points);        DrawMultiPolys(destImg,polyPoints,bClose);    }}

以下示例实现在鼠标多次点击的位置绘制多边形,main函数与画直线一样,将鼠标事件回调改成OnDrawPolyMouseEvent

std::vector<std::vector<cv::Point>> g_polys;//所有的多边形void RedrawAllPolys(){    g_originImage.copyTo(g_editImage);//恢复背景图像    DrawMultiPolys(g_editImage,g_polys,true);}void OnDrawPolyMouseEvent(int event, int x, int y, int flags, void* userdata){    if (event == cv::EVENT_LBUTTONDOWN)    {        if (g_editPoints.size() > 0)        {            g_editPoints.push_back(cv::Point(x, y));            RedrawAllPolys();            DrawOnePoly(g_editImage, g_editPoints, false);//正在绘制的多边形要单独画,而且不能闭合            imshow("image", g_editImage);        }        else        {            g_editPoints.push_back(cv::Point(x, y));//第一个点        }    }    else if (event == cv::EVENT_MOUSEMOVE)    {        if (g_editPoints.size() > 0)        {            RedrawAllPolys();            DrawOnePoly(g_editImage,g_editPoints,false);//正在绘制的多边形要单独画,而且不能闭合            DrawLine(g_editImage, g_editPoints[g_editPoints.size() - 1], cv::Point(x, y));//绘制一根到鼠标位置的直线            imshow("image", g_editImage);        }    }    else if (event == cv::EVENT_RBUTTONDOWN)    {        //右键按下结束多边形绘制,加入到g_polys        g_polys.push_back(g_editPoints);        RedrawAllPolys();        g_editPoints.clear();        cv::imshow("image", g_editImage);    }}

6、绘制填充多边形

绘制填充多边形函数cv::fillPoly,有两种形式,其中一个定义如下

void fillPoly(InputOutputArray img, InputArrayOfArrays pts,const Scalar& color, int lineType = LINE_8, int shift = 0,Point offset = Point() );

绘制填充多边形与绘制多边形轮廓差不多,只要将polylines换成fillpoly

void DrawMultiPolys(const cv::Mat& destImg, const std::vector<std::vector<cv::Point>>& points){    cv::fillPoly(destImg, points,CV_RGB(255, 0, 0));}void DrawOnePoly(const cv::Mat& destImg, const std::vector<cv::Point>& points){    if (points.size() >= 2)    {        std::vector<std::vector<cv::Point>> polyPoints;        polyPoints.push_back(points);        DrawMultiPolys(destImg,polyPoints);    }}

如果将上面的所有功能以一定方式组合起来,就可以在图像上绘制多种形状图形并保存了。

关于“怎么用OpenCV绘制图形功能”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: 怎么用OpenCV绘制图形功能

本文链接: https://lsjlt.com/news/307412.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么用OpenCV绘制图形功能
    这篇文章主要介绍“怎么用OpenCV绘制图形功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用OpenCV绘制图形功能”文章能帮助大家解决问题。1、绘制直线绘制直线函数是cv::line,函数...
    99+
    2023-06-26
  • OpenCV绘制图形功能
    本文实例为大家分享了OpenCV绘制图形功能的具体代码,供大家参考,具体内容如下 1、绘制直线 绘制直线函数是cv::line,函数完整形式如下 void line(InputOut...
    99+
    2024-04-02
  • 怎么用C++ OpenCV绘制几何图形
    本篇内容介绍了“怎么用C++ OpenCV绘制几何图形”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!具体内容如下绘制几何图形直线矩形多边形圆...
    99+
    2023-06-25
  • 怎么在python中使用opencv绘制图形
    这篇文章给大家介绍怎么在python中使用opencv绘制图形,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。实现方法1)画线段 cv.line在图片中绘制一段直线# 绘制线段# 参数1:图片#&nb...
    99+
    2023-06-14
  • C++ OpenCV绘制几何图形
    本文实例为大家分享了C++ OpenCV绘制几何图形的具体代码,供大家参考,具体内容如下 绘制几何图形 直线 矩形 多边形 圆形 椭圆 ...
    99+
    2024-04-02
  • OpenCv实现绘图功能
    本文实例为大家分享了OpenCv实现绘图功能的具体代码,供大家参考,具体内容如下 绘制一个图像在上面画线: import numpy as np import matplotli...
    99+
    2024-04-02
  • 使用c++实现OpenCV绘制旋转矩形图形
    目录功能函数测试代码测试效果  功能函数 // 绘制旋转矩形 void DrawRotatedRect(cv::Mat mask,const cv::RotatedRe...
    99+
    2024-04-02
  • Python OpenCV实现基本图形绘制
    1.导入模块 import cv2 as cv import numpy as np 2.OpenCV绘图大致步骤 OpenCV 图形绘制步骤 (1)先定义基础画布canv...
    99+
    2024-04-02
  • C++ opencv实现几何图形绘制
    目录1.矩形 rectangle()2. 圆 circle()3.椭圆 elliple()在学习过程中,我们可以在图像中绘制一些几何图形,比如矩形,椭圆,线段,填充多边形等,这些函数...
    99+
    2024-04-02
  • 怎么用Canvas绘制图形
    这篇文章主要讲解了“怎么用Canvas绘制图形”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Canvas绘制图形”吧!   Canvas绘制图形 ...
    99+
    2024-04-02
  • Python OpenCV中如何进行图形绘制
    这篇文章将为大家详细讲解有关Python OpenCV中如何进行图形绘制,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。背景使用OpenCV进行图形绘制是一种必备的技能,在图像的任务...
    99+
    2023-06-22
  • OpenCV 基本图形绘制函数详解
    用于绘制直线的line函数; 用于绘制椭圆的ellipse函数; 用于绘制矩形的rectangle函数; 用于绘制圆的circle函数; 用...
    99+
    2024-04-02
  • java怎么绘制图形
    Java中可以使用AWT和Swing库来绘制图形。1. 使用AWT库绘制图形:- 创建一个继承自`java.awt.Canvas`的...
    99+
    2023-10-07
    java
  • CSS怎么绘制图形
    这篇文章主要介绍了CSS怎么绘制图形的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇CSS怎么绘制图形文章都会有所收获,下面我们一起来看看吧。正方形/长方形<!DOCTYPE html>&l...
    99+
    2023-06-27
  • Python+OpenCV实现在图像上绘制矩形
    话不多说,直接上代码 import copy import cv2 import numpy as np WIN_NAME = 'draw_rect' class Rec...
    99+
    2024-04-02
  • OpenCV基本图形绘制函数有哪些
    本篇内容主要讲解“OpenCV基本图形绘制函数有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“OpenCV基本图形绘制函数有哪些”吧!用于绘制直线的line函数;用于绘制椭圆的ellipse...
    99+
    2023-06-25
  • Python OpenCV如何绘制各类几何图形
    这篇文章将为大家详细讲解有关Python OpenCV如何绘制各类几何图形,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一.绘制直线在OpenCV中,绘制直线需要获取直线的起点和终点坐标,调用c...
    99+
    2023-06-29
  • C++ opencv如何实现几何图形绘制
    这篇“C++ opencv如何实现几何图形绘制”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++ op...
    99+
    2023-06-30
  • HTML5中怎么绘制图形
    本篇内容主要讲解“HTML5中怎么绘制图形”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“HTML5中怎么绘制图形”吧! HTML5中...
    99+
    2024-04-02
  • 怎么用Pyecharts绘制常用的图形
    本文小编为大家详细介绍“怎么用Pyecharts绘制常用的图形”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么用Pyecharts绘制常用的图形”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.上下组合fro...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作