当前位置: 首页 > news >正文

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:…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂&#xff…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

GitFlow 工作模式(详解)

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

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...

华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)

题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...

基于鸿蒙(HarmonyOS5)的打车小程序

1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...

【深度学习新浪潮】什么是credit assignment problem?

Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...

客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践

01技术背景与业务挑战 某短视频点播企业深耕国内用户市场&#xff0c;但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大&#xff0c;传统架构已较难满足当前企业发展的需求&#xff0c;企业面临着三重挑战&#xff1a; ① 业务&#xff1a;国内用户访问海外服…...