当前位置: 首页 > 编程日记 > 正文

OpenCV 学习笔记03 boundingRect、minAreaRect、minEnclosingCircle、boxPoints、int0、circle、rectangle函数的用法...

函数中的代码是部分代码,详细代码在最后

1 cv2.boundingRect

作用:矩形边框(boundingRect),用于计算图像一系列点的外部矩形边界。

cv2.boundingRect(array) -> retval

参数:

array - 灰度图像(gray-scale image)或 2D点集( 2D point set )

返回值:元组

元组(x, y, w, h ) 矩形左上点坐标,w, h 是矩阵的宽、高,例如 (161, 153, 531, 446)

代码示例:

contours, hierarchy = cv2.findContours(re_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)for c in contours:# find bounding box coordinates# 现计算出一个简单的边界框x, y, w, h = cv2.boundingRect(c)# 画出矩形cv2.rectangle(img, (x,y), (x+w, y+h), (0, 255, 0), 2) 

2 cv2.minAreaRect

作用:minAreaRect - min Area Rect 最小区域矩形;计算指定点集的最小区域的边界矩形,矩形可能会发生旋转 possibly rotated,以保证区域面积最小。

cv2.minAreaRect(points) -> retval

参数:

points - 2D点的矢量( vector of 2D points )

返回值:元组

元组((最小外接矩形的中心坐标),(宽,高),旋转角度)----->    ((x, y), (w, h), θ )

关于旋转角度的注意事项:

1)旋转角度是水平轴(x轴)逆时针旋转,与碰到的矩形第一条边的夹角。

2)“ 第一条边 " 定义为 宽width,另一条边定义为高 height。这里的宽、高不是按照长短来定义的。

3)在 opencv 中,坐标系原点在图像左上角,将其延伸到整个二维空间,可以发现 “x轴镜像对称”,角度则 逆时针旋转为负、顺时针旋转为正。故θ∈(-90度,0];(笛卡尔坐标系中,逆时针为正、顺时针为负)

4)旋转角度为角度值,而非弧度制。

如 ((458.70343017578125, 381.97894287109375), (202.513916015625, 634.2526245117188), -45.707313537597656)

但绘制这个矩形,一般需要知道矩形的 4 个顶点坐标;通常是通过函数 cv2.boxPoints()获取。

2.1 附1 : cv2.boxPoints

作用:查找旋转矩形的 4 个顶点(用于绘制旋转矩形的辅助函数)。

cv2.boxPoints(box) -> points

参数:

box - 旋转的矩形

返回值:列表list

points - 矩形 4 个顶点组成的列表 list

返回值示例:

[[614.9866  675.9137 ][161.      232.99997][302.4203   88.04419][756.40686 530.9579 ]]

2.2 附2:int0

int0 有两种相近的描述,

第一种,int0 意味是 64位整数。字符代码'l'。与 Python int兼容,参考文档https://kite.com/python/docs/numpy.int0

int0 ( *args, **kwargs )

第二种,等价于intp,在 数组类型和类型之间的转换 文档中,有intp,释义为 “ 用于索引的整数(与C ssize_t相同;通常为int32int64)”

有人说不建议使用int0, 因为它等同内容不完全一致,如 int32,int64.

相关参考:

locating corner position using opencv

What are np.int0 and np.uint0 supposed to be?

numpy 的 int0

数据类型 --> 数组类型和类型之间的转换

What is numpy method int0?

代码示例:

contours, hierarchy = cv2.findContours(re_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)for c in contours:# find minimum area# 计算包围目标的最小矩形区域rect = cv2.minAreaRect(c)# calculate coordinate of the minimum area rectangle# 计算矩形的 4 点坐标,返回结果为float数据类型box = cv2.boxPoints(rect)# normalize coordinates to integers# 将float类型转为 int,在这里最好写成int32 / int64# 若为int0,有时候出错都不知道错在那
box =np.int0(box)# 注:OpenCV没有函数能直接从轮廓信息中计算出最小矩形顶点的坐标。所以需要计算出最小矩形区域,# 然后计算这个矩形的顶点。由于计算出来的顶点坐标是浮点型,但是所得像素的坐标值是整数(不能获取像素的一部分),# 所以需要做一个转换# draw contourscv2.drawContours(img, [box], 0, (0, 0, 255), 3)  # 画出该矩形

3 cv2.minEnclosingCircle

作用:使用迭代算法( iterative algorithm)查找包含2D点集的最小区域的圆(Finds a circle of the minimum area enclosing a 2D point set)。

cv2.minEnclosingCircle(points) -> center, radius

参数:

points - 2D点矢量(vector of 2D points)

返回值:

center - 圆心  (x, y)

radius - 半径  r

如:((426.0, 415.5), 321.7628173828125)

代码示例:

# calculate center and radius of minimum enclosing circle
# 会返回一个二元组,
# 第一个元素为圆心的坐标组成的元组,第二个元素为圆的半径值。
(x, y), radius = cv2.minEnclosingCircle(c)  
# 转为整数 cast to integers
center = (int(x), int(y))
radius = int(radius)
# 绘圆 draw the circle
img = cv2.circle(img, center, radius, (0, 255, 0), 2)

或者

cen, rad = cv2.minEnclosingCircle(c)
cen = tuple(np.int0(cen))
rad = np.int32(rad)
img = cv2.circle(img, cen, rad, (0, 255, 0), 2)

运行

注意:

cv2.circle() 函数使用时,圆心参数不能是数列array,必须是元组tuple

绘制圆cv2.circle() 函数的使用方法。

3.1 附1:cv.circle()

作用:画圆环或实心圆

cv2.circle(img, center, radius, color[, thickness[, lineType[, shift]]]) -> img

参数:

img - 目标图像

center - int 圆心,必须是元组tuple形式、不能是列表 list,必须是整型int、不能是浮点型float;

radius - int 半径,必须是整型int、不接受浮点型float。

color - 圆的颜色

thickness - int thickness = 1 圆轮廓的厚度(正数 positive),若为负值(Negative values),意味全填充的实心圆。

lineType - int lineType = 8 圆轮廓的线性,

  • 8 (or omitted) - 8-connected line.
  • 4 - 4-connected line.
  • CV_AA - antialiased line.

shift - int shift = 0 help帮助文档直译 圆心、半径值的小数位(Number of fractional bits in the coordinates of the center and in the radius value),事实上,当执行代码时,貌似又不是这个意思 。

以上若不是整数int,则会报错 TypeError: integer argument expected, got float

示例代码如下

(x, y), radius = cv2.minEnclosingCircle(c)  
center = (int(x), int(y))
radius = int(radius)
img = cv2.circle(img, center, radius, (0, 255, 0), thickness=2,lineType=8,# shift=0)# shift=1)# shift=2)# shift=3)# shift=4)# shift=5)shift=6)

分别运行,其结果:


需要注意的是不同的图,其运行代码后的识别效果是不同的,我当时用 ppt 制备 闪电 lighning 时并没有在意图片格式,就造成了运行代码后的识别结果与别人的不一致,后来将图片保存成黑底白图,和别人的图像一致了。

说明:

1)在运行代码时图片没有红色边框,为了说明每一个图,后加上的红色图像边框。

2)a、b图的大小不一样,其运行后识别的结果不一样。

3)b、d图的背底和图案颜色正好相反,其由于函数 cv2.threshold()的参数一致,所以其结果也不一致。

4)c、d图的是有无背底,其运行后识别结果也有所区别。

以上只是说明同一个代码,针对图的稍微差别,其识别结果也会存在差别。以后注意这方面内容就行。暂不深究。

4 cv2.rectangle

作用:绘制一个矩形轮廓或一个填充矩形。

cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]]) -> img

参数:

img - 待rectangle函数处理的图像

pt1 - 矩形的顶点

pt2 - 矩形的另一个顶点(但该顶点与pt2顶点相对)

color - 矩形的颜色或亮度(灰度图像)

thickness - 矩形边框的粗细,若为负值,则矩形为全填充的。int thickness=1。

lineType - Type of the line. See #LineTypes。int lineType=8。

shift - Number of fractional bits in the point coordinates.。int shift=0。

返回值:

img - 被rectangle处理过的图像。

该函数还可以直接输入矩形来替代pt1、pt2 对角点,代码如下:

cv2.rectangle(img, rec, color[, thickness[, lineType[, shift]]]) -> img

参数:

rec - 矩形,

代码示例:

# 计算出一个简单的边界框,
# 参数c为图像轮廓findContours返回值
x, y, w, h = cv2.boundingRect(c) 
# 绘制矩形
# 将轮廓信息转换成(x, y)坐标,并加上矩形的高度和宽度
cv2.rectangle(img, (x,y), (x+w, y+h), (0, 255, 0), 2) 

运行结果:

5 全代码分析

将上述函数中代码整理,所有的代码如下

import cv2
import numpy as npimg = cv2.imread('lightning.png',cv2.IMREAD_UNCHANGED)
# img = cv2.pyrUp(img)
img_gray = cv2.cvtColor(img.copy(), cv2.COLOR_BGR2GRAY)ret, re_img = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(re_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)for c in contours:# 查找矩形边界 find bounding box coordinates# 计算出简单的边界框,返回顶点坐标、宽、高x,y,w,h = cv2.boundingRect(c)# 它将轮廓信息转换程(x,y)坐标,并加上矩形的高度和宽度cv2.rectangle(img,(x,y),(x+w, y+h),(0,255,0),2)# find minimum area# 计算出包围目标的最小矩形区域rect = cv2.minAreaRect(c)# calculate coordinates of the minimum area rectangle# 计算矩形的 4 个坐标点,float形式box = cv2.boxPoints(rect)# normalize coordinates to integers# 将坐标值整数化box = np.int0(box)# draw contours# opencv没有函数能直接从轮廓信息中计算出最小矩形顶点的坐标。# 所以需要计算出最小矩形区域,然后计算这个矩形的顶点。# 计算出的顶点坐标都是浮点型,而所有像素的坐标值都是整数,# 所以需要做转换整数,然后画出这个矩形cv2.drawContours(img, [box], 0, (0,0,255), 3)# calculate center and radius of minimum enclosing circle# 大多数绘图函数把绘图颜色和密度thickness放在最后两个参数里# 最后检查的边界轮廓为最小闭圆# minEnclosingCircle函数返回一个二元组,# 第一个元数为圆心,第二个元素为半径(x,y), radius = cv2.minEnclosingCircle(c)# cast to integerscenter = (int(x),int(y))radius = int(radius)# draw the circleimg = cv2.circle(img,center,radius,(0,255,0),2, lineType=8, shift=6)cv2.drawContours(img,contours, -1, (255,0,0), 1)
cv2.imshow("contours",img)
cv2.waitKey()

运行:

参考:

轮廓特征——官网

笛卡尔坐标系

python opencv minAreaRect 生成最小外接矩形

OpenCV 中boundingRect、minAreaRect、minEnclosingCircle用法

OpenCV的基本绘图函数

openCV检测物体边缘

OpenCv学习笔记3--轮廓检测,多边形 直线 圆检测

python-opencv boundingRect使用注意

简单的验证码识别(opecv)(基于c/c++的示例代码)

opencv的一些函数——contours

opencv图像轮廓

此外还有  Opencv 图像金字塔pyrDown和pyrUp函数

【OpenCV笔记 06】OpenCV中绘制基本几何图形【矩形rectangle()、椭圆ellipse() 、圆circle() 】——基于c/c++的,但可以参考

转载于:https://www.cnblogs.com/gengyi/p/10317664.html

相关文章:

实验1 应用SQL Server进行数据定义和管理

实验1 应用SQL Server进行数据定义和管理 【实验目的】 1)熟悉SQL Server的配置和管理。 2)掌握数据库的定义和修改方法。 3)掌握表的定义和修改方法。 4)掌握使用SQL语句进行数据管理的方法。 【实验环境】 SQL Server 20…

谷歌Chrome浏览器发布

谷歌已提前启用了浏览器Google Chrome的官方网站gears.google.com/chrome/,今天该浏览器的Windows版本首发。在此以前,谷歌与微软之间的斗争更象是“冷战”,大多局限于谷歌开发小型的、基于网络的软件,与微软占主导地位的Word、Po…

【bzoj1853】[Scoi2010]幸运数字 容斥原理+搜索

题目描述 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是“幸运号码”!但是这种“幸运号码”…

Creating a LINQ Enabled ASP.NET Web application template using C#.[转]

原文地址:http://www.wwwcoder.com/Weblogs/tabid/283/EntryID/839/Default.aspx其他相关地址:Building and using a LINQ for SQL Class Library with ASP.NET 2.0 1. Install Visual Studio 2005 RTM. 2. Download and install "…

深入理解Java线程池:ThreadPoolExecutor

线程池介绍 在web开发中,服务器需要接受并处理请求,所以会为一个请求来分配一个线程来进行处理。如果每次请求都新创建一个线程的话实现起来非常简便,但是存在一个问题: 如果并发的请求数量非常多,但每个线程执行的时间…

[zt]petshop4.0 详解之八(PetShop表示层设计)

代码中,InsertUser()方法就是负责用户的创建,而在之前则需要判断创建的用户是否已经存在。InsertUser()方法的定义如下: privatestaticboolInsertUser(OracleTransaction transaction, intuserId, stringemail, stringpassword, intpassForma…

Install Java 8 Ubuntu

sudo add-apt-repository ppa:webupd8team/javasudo apt-get -y update sudo apt-get -y install oracle-java8-installer sudo vim /etc/environment Add this at the end of the file JAVA_HOME"/usr/lib/jvm/java-8-oracle" source /etc/environment转载于:https:…

实验2  使用T-SQL编写程序

实验2 使用T-SQL编写程序 【实验目的】 1)掌握常用函数的使用方法。 2)掌握流程控制语句的使用方法。 【实验环境】 SQL Server 2012 Express(或SQL Server 2017 Express) 【实验重点及难点】 1&…

超酷flash光芒光线特效

http://thefwa.com/ 一个不错的英文设计展示站点 超酷flash光芒光线特效 http://www.zcool.com.cn/flash/light/page_1.html

实验3  数据库综合查询

实验3 数据库综合查询 一、实验目的 掌握SELECT语句的基本语法和查询条件表示方法;掌握查询条件种类和表示方法;掌握连接查询的表示及使用;掌握嵌套查询的表示及使用;了解集合查询的表示及使用。 二、实验环境 已安装SQL Serv…

Find Large Files in Linux

https://www.rosehosting.com/blog/find-large-files-linux/转载于:https://www.cnblogs.com/WCFGROUP/p/10328469.html

Linux统计行数命令wc(转)

Linux wc命令用于计算字数。 利用wc指令我们可以计算文件的Byte数、字数、或是列数,若不指定文件名称、或是所给予的文件名为"-",则wc指令会从标准输入设备读取数据。 语法 wc [-clw][--help][--version][文件...] 参数 -c或--bytes或--chars …

There is no Citrix MetaFrame server configured on the specified address错误的解决方法

环境:windows server 2003 enterprise Citrix MetaFrame XP Server for Windows with Feature Release 3MetaFrame XP 1.0 Service Pack 4 for Windows 2003公网IP内网IP(有防火墙) 客户端:windows xp sp2Citrix MetaFrame Program Neighborhood Version 9.00.32649 错误描述:使…

Cisco交换机解决网络蠕虫病毒***问题

Cisco交换机解决网络蠕虫病毒***问题今年来网络蠕虫泛滥给ISP和企业都造成了巨大损失,截至目前已发现近百万种病毒及***。受感染的网络基础设施遭到破坏,以Sql Slammer为例,它发作时会造成丢包率为30%。我们如何在LAN上防范蠕虫?大…

实验4  数据的安全性管理

实验4 数据的安全性管理 一、实验目的 掌握SQL Server身份验证模式。掌握创建登录账户、数据库用户的方法。掌握使用角色实现数据库安全性的方法。掌握权限的分配。 二、实验内容 1、设置身份验证模式:Windows身份验证模式和混合模验证模式。 2、设置登录账户 …

scala构建工具sbt使用介绍

sbt工具下载及说明: https://www.scala-sbt.org/0.13/docs/zh-cn/Installing-sbt-on-Windows.html sbt是交互式构建工具,使用scala定义任务并执行它们 目录下启动 sbt,然后执行 run 命令进入到 sbt 的交互式命令 $ mkdir hello $ cd hello $ …

读书笔记--C陷阱与缺陷(三)

第三章 1. 指针与数组 书中强调C中数组注意的两点: 1) C语言只有一维数组,但是数组元素可以是任何类型对象,是另外一个数组时就产生了二维数组。数组大小是常数(但GCC实现了变长数组。。) 2) 一个数组只能做两…

[导入]儿子语录

2008.09.16:笑脸,笑脸,不笑脸,不笑脸,不高兴脸,不高兴脸。2008.09.19:爸爸是黄毛毛虫,我是绿毛毛虫,妈妈是紫毛毛虫,奶奶是咖啡色毛毛虫,太太是白…

ISA2006标准版,本地主机不能上网问题的解决一例

今天,帮一位朋友解决ISA SERVER2006标准版本地主机不能上网的问题,中间经历了一些困难,有点意思,故写了下来,供各位参考分享。一、安装环境:windows server 2003 sp2isa server 2006 标准版双网卡 外网卡固…

第8章系统服务(简易音频播放器的实现)

开发一个简易音乐播放器,要求实现: 综合使用Service,BroadCast,ContentProvider等组件实现后台播放。 播放和暂停、上一首、下一首、停止;后台播放功能, 按下返回键退出应用后再次打开应用,UI 显示应能与当…

await使用中的阻塞和并发(一)

好吧,不加点陈述不让发首页。那我们来陈述一下本篇提到的问题和对应的方法。 在.NET4.5中,我们可以配合使用async和await两个关键字,来以写同步代码的方式,实现异步的操作。 好处我目前看来有两点: 1.不会阻塞UI线程。…

中国经济是前所未有二元经济(转)

今天的中国是一个前所未有的二元经济,而且是三七开的二元经济,我国这么多年的经济发展,每一年GDP以10%的成长率增长的原因,就是二元经济的过热部门推动的,因此我们GDP的组成是非常扭曲的,超过一半都是固定资…

Unity 简单示例代码和向导/Unity Aplication Block

Unity 简单示例代码和向导 关于Unity 的说明和下载地址,请访问[微软控制反转和依赖注入容器Unity 1.0发布] http://forum.entlib.com/Default.aspx?gposts&t25 。 下面的范例主要实现:首先,定义ILogger 接口。然后,定义一个实…

crontab修改默认编辑器

$ sudo select-editor 选择3或者4 然后再次打开 crontab -e 就会是vim的方式了。 转载于:https://www.cnblogs.com/jiqing9006/p/10343035.html

Programming C# 学习笔记(二) 出发:“Hello World”

小序: 准备写这章的学习笔记了,啊,Hello World!多么亲切的语句,呵呵,当初学C语言的第一个程序就是输出它, 还记得费了好大劲终于把它输出来时候的那种兴奋感觉,真是让我怀念哦&a…

多IP绑定与多网卡绑定

多IP绑定: 实验目的: 实现如下图网络连接 实现 A, B 在分配不同网段的网络地址的情况下可以互联 实验条件有限,在没有交换机的情况下,将主机A ,B,路由器R1处于同一网络。将三台虚拟机的网络适配器设置为仅主…

华硕WL-500W无线路由器使用感受

作为一款实用型的家庭或小型企业应用的无线路由器&#xff0c;WL-500W有着独特的外观&#xff1a;<?xml:namespace prefix v ns "urn:schemas-microsoft-com:vml" /><?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office"…

什么是物联网网关?物联网网关具备什么功能?_转

参考&#xff1a;什么是物联网&#xff1f;物联网产业链体系深度分析 随着物联网概念的不断深入&#xff0c;商业级的网络应用遍地开花&#xff0c;各种智能家电层出不穷&#xff0c;改善着我们的生活。与此同时&#xff0c;物联网网关也将成为连接的重要纽带。作为网关设备&am…

MSDN Webcast“深入浅出ASP.NET AJAX系列”

课程&#xff1a; ASP.NET AJAX深入浅出系列课程(1)&#xff1a;ASP.NET AJAX 概述&#xff08;3月13日&#xff09;&#xff1a;对于ASP.NET AJAX的大致功能进行概述和演示&#xff0c;通过简单的演示让听众了解到ASP.NET AJAX框架的强大之处&#xff0c;以及对于开发带来的便…

技巧:结合Zabbix与SNMP监控嵌入式设备

在如何利用Zabbix监控网络设备三篇文章的前两篇中&#xff0c;我们介绍了如何通过Zabbix代理监控网络设备。但有些设备无法安装Zabbix代理&#xff0c;需要采用其他方法监控。需要考虑无法安装软件的嵌入式设备或应用程序。对于这些设备&#xff0c;可通过SNMP进行监控。    …