OpenCV入门(四)快速学会OpenCV3画基本图形

news2024/11/24 18:58:47

OpenCV入门(四)快速学会OpenCV3画基本图形

1.画点

在OpenCV中,点分为2D平面中的点和3D平面中的点,区别就是3D中点多了一个z坐标。我们首先介绍2D中的点,坐标为整数的点可以直接用(x, y)代替,其中x是横坐标、y是纵坐标。

比如定义一个点:

     pt=(100,200) #横坐标x=100,纵坐标y=200

画图时如果需要用到点,就可以直接用(x,y)作为参数代入。

比如有一个点的列表:

    # 要画的点的坐标
    points_list = [(160, 160), (136, 160), (150, 200), (200, 180), (120, 150), (145,
180)]

2.画矩形

全局函数rectangle用来通过对角线上的两个顶点绘制矩形,函数声明如下:

     cv.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]] ) 
     cv.rectangle(img, rec, color[, thickness[, lineType[, shift]]] ) 

其中,参数
img表示矩形所在的图像;
pt1表示矩形的一个顶点;
pt2表示矩形对角线上的另一个顶点;
color表示线条颜色(BGR)或亮度(灰度图像,grayscale image);
thickness表示组成矩形的线条的粗细程度,取负值时(如CV_FILLED)函数绘制填充了色彩的矩形;line_type表示线条的类型;shift表示坐标点的小数点位数。

     import cv2 as cv
     img = cv.imread("test.jpg")
     img1=cv.rectangle(img,(10,10),(30,40),(255,0,0),2)
     cv.imwrite("res.jpg",img1)#保存图片
     cv.imshow("res", img1)
     cv.waitKey(0)

在上述代码中,我们首先读取test.jpg,然后调用画矩形函数rectangle绘制一个矩形,其中点(10,10)是左上角顶点、点(30,40)是右下角顶点。颜色值是(255,0,0),是BGR形式,即蓝色分量值是255,因此显示的是蓝色。组成矩形的线条的粗细值是2。

画完后,我们保存到同目录下的res.jpg文件。

运行工程,结果如图所示。可以看到,窗口左上角的地方有一个蓝色边框的矩形。

****

3.画圆

全局函数circle用来绘制或填充一个给定圆心和半径的圆,函数声明如下:

     cv.circle(img, center, radius, color[, thickness[, lineType[, shift]]])

其中,参数
img表示输入的图像(圆画在这个图像上);
center表示圆心坐标;radius表示圆的半径;
color表示圆的颜色,是BGR形式,例如蓝色为Scalar(255,0,0);
thickness如果是正数就表示组成圆的线条的粗细程度,否则表示圆是否被填充;
lineType表示线的类型;
shift表示圆心坐标点和半径值的小数点位数。

import numpy as np
import cv2 as cv
 
img = cv.imread("test.jpg")
point_size = 10
point_color = (0, 0, 255) # BGR
thickness = -1  
 
# 要画的点的坐标
points_list = [(16, 16),  (35, 40) ]
 
for point in points_list:
	cv.circle(img, point, point_size, point_color, thickness)
	thickness = 4
 
# 画圆,圆心为:(60, 60),半径为:60,颜色为:point_color,实心线
cv.circle(img, (60, 60), 60, point_color, 0)
 
cv.namedWindow("image")
cv.imshow('image', img)
cv.waitKey (10000) # 显示 10000 ms 即 10s 后消失
cv.destroyAllWindows()

首先读取图片test.jpg,然后在for循环中,第一次画实心圆(thickness是-1),第二次画空心圆(thickness是4),并且组成圆的线条的粗细程度是4。接着画一个半径是60的圆。

所有圆都是在图片test.jpg上画的。

运行工程,结果如图所示。

在这里插入图片描述

4.画椭圆

函数ellipse用来绘制或者填充一个简单的椭圆弧或椭圆扇形。圆弧被ROI矩形所忽略,反走样弧线和粗弧线使用线性分段近似值,所有的角都以角度的形式给定。

该函数声明如下:

    Ellipse(img, center, axes, angle, start_angle, end_angle, color, thickness=1,
lineType=8, shift=0) 

其中,参数
img表示输入的图像(圆画在这个图像上);
center表示椭圆圆心坐标;
axes表示轴的长度;
angle表示偏转的角度;
start_angle表示圆弧起始角的角度;
end_angle表示圆弧终结角的角度;
color表示线条的颜色;
thickness表示线条的粗细程度;
line_type表示线条的类型;
shift表示圆心坐标点和数轴的精度。

下面看一个实例,绘制丰田车标。丰田车标是由3个椭圆组成的:两个横着,一个竖着。

import numpy as np
import cv2 as cv
 
img = cv.imread("test.jpg")
points_list = [ (45, 45),  (45, 45),(45, 32) ]
size_list = [ (40, 25),  (25, 11),(28, 12) ]
color = (0, 0, 255) # BGR

#绘制第一个椭圆,大椭圆,颜色为红色
cv.ellipse(img, points_list[0],size_list[0], 0, 0, 360, color, 5, 8);
#绘制第二个椭圆,竖椭圆	
cv.ellipse(img,points_list[1], size_list[1], 90, 0, 360, color, 5, 8);
#绘制第三个椭圆,小椭圆(横)	
cv.ellipse(img, points_list[2],size_list[2], 0, 0, 360, color, 5, 8);	
cv.imshow("丰田", img);
cv.waitKey (10000) # 显示 10000 ms 即 10s 后消失

代码很简单,调用ellipse函数画3个椭圆。

运行工程,结果如图所示。
在这里插入图片描述

画圆和画椭圆的联合作战:

import numpy as np
import cv2 as cv
 
WINDOW_WIDTH=200    #定义窗口大小

def DrawFi1ledCirc1e(img,center ):
    thickness = -1
    lineType = 8
    color = (0, 0, 255) # BGR
    cv.circle(img, center,  WINDOW_WIDTH//32, color, thickness, lineType)
 


def DrawEllipse(  img,   angle):
    thickness = 2;
    lineType = 8;
    color = (255, 129, 0) # BGR
    pt=(WINDOW_WIDTH // 2, WINDOW_WIDTH // 2)
    size = (WINDOW_WIDTH // 4, WINDOW_WIDTH // 16)
    cv.ellipse(img, pt,size, angle, 0, 360,color,thickness, lineType)
 
h=WINDOW_WIDTH
w=WINDOW_WIDTH
atomImage=np.zeros((h, w, 3), np.int8)
 
rookImage=np.zeros((h, w, 3), np.int8)
#绘制椭圆
DrawEllipse(atomImage, 90);
DrawEllipse(atomImage, 0);
DrawEllipse(atomImage, 45);
DrawEllipse(atomImage, -45);

#绘制圆心
DrawFi1ledCirc1e(atomImage,(WINDOW_WIDTH // 2,WINDOW_WIDTH // 2));

cv.imshow("result", atomImage);
cv.waitKey(0);

代码很简单,画了4个椭圆和一个实心圆,实心圆画在所有椭圆的圆心,也就是圆和4个椭圆的圆心是重合的。运行工程,结果如图所示。
在这里插入图片描述

5.画线段

在OpenCV中,函数line用来实现画线段,函数声明如下:

    line(img, pt1, pt2, color[, thickness[, lineType[, shift]]])

其中,参数
img表示输入的图像(圆画在这个图像上);
pt1表示线段的起始点;
pt2表示线段的结束点;
color表示线段颜色;
thickness表示线段粗细;
lineType表示线段类型;
shift表示点坐标中的小数位数。

6.画多边形

在OpenCV中,函数polylines用来画多边形,函数声明如下:

     polylines(img, pts, isClosed, color[, thickness[, lineType[, shift]]])

其中,参数
img表示输入的图像;
pts表示多边形点集;
isClosed表示绘制的多段线是否闭合,如果是闭合的,那么函数将从每条曲线的最后一个顶点到其第一个顶点绘制一条直线;
color表示多边形颜色;
thickness表示多段线边的厚度;
lineType表示线段类型;
shift表示点坐标中的小数位数。

画一个多边形:

import cv2
import numpy as np
 
img = cv2.imread("test.jpg")
Pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
cv2.polylines(img,[Pts],True,(0,0,255),2)
cv2.imshow("res", img); 
cv2.waitKey(0);

首先读取test.jpg,然后定义一个点集数组Pts,接着调用polylines绘制多边形,最后显示出来。
在这里插入图片描述

7.填充多边形

在OpenCV中,除了绘制多边形之外,还可以填充多边形。函数fillPoly用来填充多边形,函数声明如下:

     fillPoly(img, pts, color[, lineType[, shift[, offset]]])

其中,参数
img表示输入的图像;
pts表示多边形点集;
color表示多边形颜色;
lineType表示线段类型;
shift表示点坐标中的小数位数;
offset表示等高线所有点的偏移。

import numpy as np
import cv2 as cv
 
a = cv.imread("test.jpg")
triangle = np.array([ [10,30], [40,80], [10,90] ], np.int32)
cv.fillPoly(a, [triangle],(255,0,0))
cv.imshow("result", a)
cv.waitKey(0)

代码中,“[10,30],[40,80],[10,90]”为要填充的轮廓坐标,通过函数fillPoly填充多边形,填充的颜色是蓝色。

如图所示:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/392052.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

快速幂----快速求解底数的n次幂

目录 一.快速幂 1.问题的引入 2.快速幂的介绍 3.核心思想 4.代码实现 2.猴子碰撞的方法数 1.题目描述 2.问题分析 3.代码实现 一.快速幂 1.问题的引入 问题:求解num的n次幂,结果需要求余7 对于这个问题我们可能就是直接调用函数pow(a,b)来直接求解a的b次幂问题,但是如果…

灵巧手抓持<分类><仿真>

获取灵巧手抓取物体时的抓持类型,需要考虑:手本身的结构、被抓取物体的形状尺寸、抓持操作任务的条件。 研究方法:基于模型的方法、基于数据驱动的方法 基于模型的方法:建立灵巧手抓持相关的运动学和动力学模型建立目标函数求解…

【操作系统】进程和线程的区别

文章目录1. 概述2. 进程3. 线程4. 协程5. 进程与线程区别1. 概述 进程和线程这两个名词天天听,但是对于它们的含义和关系其实还有点懵的,其实除了进程和线程,还存在一个协程,它们的关系如下: 首先,我们需要…

C++基础——Ubuntu下编写C++环境配置总结(C++基本简介、Ubuntu环境配置、编写简单C++例程)

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《QT开发实战》 《嵌入式通用开发实战》 《从0到1学习嵌入式Linux开发》 《Android开发实战》 《实用硬件方案设计》 长期持续带来更多案例与技术文章分享…

优思学院|质量管理简史:从质检到质控,到六西格玛管理

在现代的工业化生产中,质量管理已成为企业生产运营的不可或缺的一部分。经过长时间的探索和实践,质量管理的理论和实践已经逐步成熟,并形成了完整的体系。下面,我将简要介绍一下质量管理学的发展历程。 质量管理的萌芽期&#xff…

socket聊天室--socket的建立

socket聊天室–socket实现 文章目录 socket聊天室--socket实现socket()bind()listen()accept()connect()发送接收read()函数recv()函数write()函数send()函数close()关闭套接字IP 地址格式转换函数socket() #include <sys/types

web餐饮开源程序

简介 一款专门针对餐饮行业而开发桌面应用程序 技术 借助Panuon.UI.Silver控件库&#xff0c;开发的一款餐饮软件。 运行环境&#xff1a;.NETFramework,Versionv4.8。 运行数据库&#xff1a;MySql。 ORM框架&#xff1a;SqlSugar。 第三方插件&#xff1a;Panuon.UI.Silv…

OpenKruise 开发者不容错过的带薪实习机会!马上加入 LFX Mentorship 计划

LFX Mentorship 计划由 Linux Foundation 组织发起&#xff0c;为像 OpenKruise 这样的 CNCF 托管项目提供了激励开源贡献、扶植社区发展的优秀土壤。参与其中的开发者不仅有机会在经验丰富的社区 Mentor 指导下贡献开源项目、为职业生涯加分&#xff0c;完成工作后还能获得 $3…

【JAVA】Java中集合的遍历

&#x1f3c6;今日学习目标&#xff1a;集合遍历 &#x1f603;创作者&#xff1a;颜颜yan_ ✨个人主页&#xff1a;颜颜yan_的个人主页 ⏰本期期数&#xff1a;第五期 &#x1f389;专栏系列&#xff1a;JAVA 集合遍历前言一、Iterator接口二、foreach循环总结前言 在实际开发…

JavaScript基础二、变量

零、文章目录 文章地址 个人博客-CSDN地址&#xff1a;https://blog.csdn.net/liyou123456789个人博客-GiteePages&#xff1a;https://bluecusliyou.gitee.io/techlearn 代码仓库地址 Gitee&#xff1a;https://gitee.com/bluecusliyou/TechLearnGithub&#xff1a;https:…

UE4 材质学习 (焚烧材质)

效果步骤随便从网上下载一张图片&#xff08;地址&#xff1a;链接/链接&#xff09;&#xff0c;导入UE中新建一个材质函数这里命名为“E_Function”双击打开该材质函数&#xff0c;由于需要输出变发光和变透明两种效果&#xff0c;因此这里需要两个输出节点&#xff1a;分别命…

MIPI协议

MIPI调试指南Rev.0.1 June 18, 2019 © 2018 Horizon Robotics. All rights reserved.Revision HistoryThissection tracks the significant documentation changes that occur fromrelease-to-release. The following table lists the technical content changes foreach …

RK3568平台开发系列讲解(显示篇)framebuffer屏幕显示

🚀返回专栏总目录 文章目录 一、FrameBuffer介绍二、FrameBuffer应用程序沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍如何通过framebuffer进行显示。 一、FrameBuffer介绍 FrameBuffer中文译名为帧缓冲驱动,它是出现在2.2.xx内核中的一种驱动程序接口…

飞沃科技上市,张友君还缺颗“螺丝”

文丨熔财经作者|余一去年7月&#xff0c;湖南飞沃新能源科技股份有限公司(下称&#xff1a;飞沃科技)首发过会&#xff0c;至今7个多过去了&#xff0c;若是按照2022年以来整体IPO排队时长来计算&#xff0c;飞沃科技已经来到了临近上市的关键节点。资料显示&#xff0c;近年来…

测开:前端基础-css页面布局-定位

一 、传统网页布局的三种方式 网页布局的本质–用CSS来摆放盒子&#xff0c;把盒子摆放到相应的位置&#xff0c;css提供了三种传统布局方式&#xff0c;分别是标准流&#xff0c;浮动和定位三种。 二、 定位 2.1 啥是定位 我的理解&#xff0c;就是要把这个元素&#xff0c…

一文掌握组织项目等级划分维度,标准和实例

当你遇到多项目怎么管&#xff1f;遇到项目之间的冲突怎么解决&#xff1f;很多公司没有项目优先级的划分&#xff0c;会对企业造成很多严重的问题。首先&#xff0c;会造成不合理的资源分配&#xff1a;缺少项目优先级的情况下&#xff0c;很难确定哪些项目是最重要的&#xf…

DAGA项目 代码阅读笔记1——LSTM-LM部分代码

DAGA 代码阅读笔记1——LSTM-LM部分代码 文章目录DAGA 代码阅读笔记1——LSTM-LM部分代码概述main函数逻辑分析设置训练参数fields初始化训练数据读入模型建立优化器概述 ​ 学习人工智能的必经之路——读代码。目前阅读的代码来自于github数据增强项目DAGA&#xff0c;这个项…

socket 编程实战(编写客户端程序 )

编写客户端程序 接着上一篇&#xff1a;实战服务端程序 接下来我们再编写一个简单地客户端应用程序&#xff0c;客户端的功能是连接上小节所实现的服务器&#xff0c;连接成功之后向服务器发送数据&#xff0c;发送的数据由用户输入。示例代码如下所示&#xff1a; #include…

大数据开发治理平台 DataWorks

序言学习下阿里DataWorks的设计理念以及要做的事情cuiyaonan2000163.com参考文档:https://www.aliyun.com/product/bigdata/idehttps://help.aliyun.com/document_detail/73015.htmlhttps://help.aliyun.com/document_detail/324149.html ----数据治理LaunchDataWorks基于阿里云…

ECCV 2022|面向精确的主动相机定位算法

标题&#xff1a;ECCV 2022,山东大学、北大、腾讯AILab、斯坦福和三维家联合提出&#xff0c;面向精确的主动相机定位算法项目地址&#xff1a;https://github.com/qhFang/AccurateACL.文章&#xff1a;Towards Accurate Active Camera Localization&#xff08;ECCV 2022&…