OpenCV入门(四)快速学会OpenCV3画基本图形
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 cvimg = 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 cvimg = 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 cvimg = 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 cvWINDOW_WIDTH=200 #定义窗口大小def DrawFi1ledCirc1e(img,center ):thickness = -1lineType = 8color = (0, 0, 255) # BGRcv.circle(img, center, WINDOW_WIDTH//32, color, thickness, lineType)def DrawEllipse( img, angle):thickness = 2;lineType = 8;color = (255, 129, 0) # BGRpt=(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 npimg = 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 cva = 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填充多边形,填充的颜色是蓝色。
如图所示:
相关文章:

OpenCV入门(四)快速学会OpenCV3画基本图形
OpenCV入门(四)快速学会OpenCV3画基本图形 1.画点 在OpenCV中,点分为2D平面中的点和3D平面中的点,区别就是3D中点多了一个z坐标。我们首先介绍2D中的点,坐标为整数的点可以直接用(x, y)代替,其中x是横坐标…...

【MAC OS 命令行】Redis的安装、启动和停止。就是如此简单
目录Mac 安装 Redis使用 Homebrew 安装 Redis总结Mac 安装 Redis 使用 Homebrew 安装 Redis 如果没有安装 Homebrew,先安装 Homebrew 执行命令: 方法一、brew 官网的安装脚本 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homeb…...

Leetecode 661. 图片平滑器
图像平滑器 是大小为 3 x 3 的过滤器,用于对图像的每个单元格平滑处理,平滑处理后单元格的值为该单元格的平均灰度。 每个单元格的 平均灰度 定义为:该单元格自身及其周围的 8 个单元格的平均值,结果需向下取整。(即&…...
剑指 Offer II 020. 回文子字符串的个数
题目链接 剑指 Offer II 020. 回文子字符串的个数 mid 题目描述 给定一个字符串 s,请计算这个字符串中有多少个回文子字符串。 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。 示例 1: 输入…...

Python实现多键字典
实现背景 在许多场景中,有时需要通过多种信息来获取某个特定的值,而各种编程语言(包括Python)使用的字典(Dict)数据结构通常只支持单个键值寻值key-val对,即“一对一”(一个键对应一…...

【python socket】实现websocket服务端
一、获取握手信息首先通过如下代码,我们使用socket来获取客户端的握手信息import socketsock socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(("127.0.0.1", 8002)) sock.li…...
PANGO的CFG那些事
先来看位于VCCIOCFG这个bank上引脚, MODE JTAG时,MODExxx. except 3’b000. 禁止设置为3’b000. Slave Parallel时,MODE 3’b110,不常用。 Slave Serial时,MODE 3’b111,不常用。 Master SPI 时&…...

路由协议(OSPF、ISIS、BGP)实验配置
目录 OSPF基础实验 建立OSPF邻居 配置虚连接 配置接口的网络类型 配置特殊区域 配置路由选路 配置路由过滤 ISIS基础实验配置 配置ISIS邻居建立 配置认证 配置路由扩散 配置路由过滤 配置定时器 BGP基础实验配置 建立BGP对等体 建立IBGP对等体 建立EBGP对等体…...

Python可变对象与不可变对象的浅拷贝与深拷贝
前言 本文主要介绍了python中容易面临的考试点和犯错点,即浅拷贝与深拷贝 首先,针对Python中的可变对象来说,例如列表,我们可以通过以下方式进行浅拷贝和深拷贝操作: import copya [1, 2, 3, 4, [a, b]]b a …...

滑模控制(Sliding mode control)快速入门
0. 简介 最近作者受到邀请,让我帮忙给刚入门的学弟讲讲滑模控制。可是作者也不知道怎么向未入门的学弟讲解这些基础知识,所以作者翻了翻近几年写的很好的文章以及视频。综合起来,来总结出一套比较基础,且适用于初学者的文章吧。这…...

golang的垃圾回收详解
golang的垃圾回收详解 一、三色标记法 作为一门现代化的语言,golang与java一样,都在语言中内置了垃圾回收的功能,不需要程序员自己去回收堆内存。而垃圾回收中,最重要的两个部分就是垃圾检测算法以及垃圾回收算法。垃圾检测算法决…...

线上负载过高排查(top/vmstat/ifstat/free/df)
目录 一、五大命令 二、故障排查步骤 1、top命令找出CPU占比最高的 2、ps -ef 或者 jps -l进一步定位 3、ps -mp位到具体线程或者代码 4、jstack精准定位到错误的地方 本文通过学习:周阳老师-尚硅谷Java大厂面试题第二季 总结的LinuxJDK命令操作相关的笔记 一…...

Java的注解(Annotation)
Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。Java 中的类、构造器、方法、成员变量、参数等都可以被注解进行标注。例如JUnit单元测试中的Test方法,可以使得方法直接运行。JUnit单元测试Test单元测试是针…...
信息系统项目管理师:配置管理
配置管理指的是在一个系统或软件中对配置项的管理,包括对配置项的定义、存储、跟踪和修改等一系列活动。配置项可以是硬件设备、软件组件、系统设置、网络配置等,配置管理旨在确保在不同时间点或环境下系统或软件的配置项的正确性和一致性。通过配置管理…...
web餐饮开源程序
简介 一款专门针对餐饮行业而开发桌面应用程序 技术 借助Panuon.UI.Silver控件库,开发的一款餐饮软件。 运行环境:.NETFramework,Versionv4.8。 运行数据库:MySql。 ORM框架:SqlSugar。 第三方插件:Panuon.UI.Silv…...

28个案例问题分析---027---单表的11个Update接口--MyBatis
一:背景介绍 项目开发中。我们使用的是MyBatis,在MyBatis的xml文件里,两个表的更新功能,写了足足11个更新接口,毫无复用的思想 这种方式可以正常的实现功能,但是没有复用,无论是从时间上还是维…...

大数据开发治理平台 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基于阿里云…...

Xshell的下载、使用、配置【ssh、telnet、串口】
目录 一、概述 二、Xshell的使用 2.1 Xshell使用ssh协议远程连接Linux主机或服务器 2.2 Xshell使用telnet协议远程连接Linux开发板 2.3 Xshell使用SERIAL协议远程连接Linux开发板 三、Xshell常用配置 3.1 配置默认会话属性 一、概述 Xshell是由NetSarang公司开发的强大…...

C++回顾(七)—— 面向对象模型
7.1 静态成员变量和静态成员函数 7.1.1 静态成员变量 关键字 static 可以用于说明一个类的成员;静态成员提供了一个同类对象的共享机制;把一个类的成员说明为 static 时,这个类无论有多少个对象被创建,这些对象共享这个 static …...

开源监控服务uptime-kuma
好久没写文章了,刚好最近用了一个开源的监控服务,感觉蛮有意思的,记录一下 (一)安装 uptime-kuma安装方式有几种,这里当然是选择大家都爱的docker,一条命令搞定 docker run -d --restartalways -p 3001:…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...

接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...