python椭圆拟合_opencv python 轮廓特征/凸包/外接矩形/外接圆/拟合矩形/拟合直线/拟合圆...

Contour Features

1 图像的矩

cv2.moments()

图像的矩可以帮助计算物体的某些特征,如对象的质心,对象的区域等.

代码:

import cv2

import numpy as np

img = cv2.imread('img7.png',0)

ret,thresh = cv2.threshold(img,127,255,0)

im2,contours,hierarchy = cv2.findContours(thresh, 1, 2)

cnt = contours[0]

M = cv2.moments(cnt)

print( M )

输出:{'m00': 283.0, 'm10': 8260.666666666666, 'm01': 34747.666666666664, 'm20': 251349.8333333333, 'm11': 1008063.0, 'm02': 4274513.166666666, 'm30': 7941981.4, 'm21': 30484543.9, 'm12': 123258620.46666667, 'm03': 526819846.70000005, 'mu20': 10223.989595602674, 'mu11': -6208.702394974302, 'mu02': 8080.874165684916, 'mu30': 8302.495426246896, 'mu21': -14552.154961312423, 'mu12': 11791.528133469663, 'mu03': -3268.923251092434, 'nu20': 0.12765785058625623, 'nu11': -0.07752253611575, 'nu02': 0.10089867729257346, 'nu30': 0.006162296011483629, 'nu21': -0.010800931752771139, 'nu12': 0.008751933371317017, 'nu03': -0.0024262672459139235}

此刻,可以提取有用的数据,如面积,质心等.

质心由关系给出:

cx = int(M['m10']/M['m00'])

cy = int(M['m01']/M['m00'])

2轮廓面积

cv2.contourArea(contour[, oriented])

3轮廓周长

cv2.arcLength(curve, closed)

第二个参数指定形状是否为闭合轮廓

4轮廓近似

它根据我们指定的精度将轮廓形状近似为具有较少顶点数的另一个形状.它是Douglas-Peucker算法的一种实现方式.

cv2.approxPolyDP(curve, epsilon, closed[, approxCurve])

第二个参数epsilon,它是从轮廓到近似轮廓的最大距离.第三个参数指定曲线是否闭合.

下面,在第二幅图像中,绿线表示epsilon =弧长的10%的近似曲线. 第三幅图像显示相同的epsilon =弧长的1%.

代码:

import cv2

import numpy as np

img = cv2.imread('img8.png')

cv2.imshow('src',img)

imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, thresh = cv2.threshold(imgray, 127, 255, 0)

im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

cnt = contours[1]

epsilon = 0.1*cv2.arcLength(cnt,True)

approx = cv2.approxPolyDP(cnt,epsilon,True)

cv2.polylines(img, [approx], True, (0, 0, 255), 2)

cv2.imshow('show',img)

cv2.waitKey()

5凸包

凸包看起来类似轮廓近似,但是它不是(两者在某些情况下可能提供相同的结果).

convexHull(points[, hull[, clockwise[, returnPoints]]]):检查曲线的凸性缺陷并进行修正.

points:传入的轮廓

hull:输出

clockwise:方向标志,如果为True,则顺时针方向输出凸包.

returnPoints:默认情况下为True,然后它返回hull points的坐标; 如果为False,则返回与hull points对应的轮廓点的索引

下面的手形图像. 红线表示手的凸包, 双面箭头标记显示凸起缺陷.

代码:

import cv2

import numpy as np

img = cv2.imread('img8.png')

imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, thresh = cv2.threshold(imgray, 127, 255, 0)

im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

cnt = contours[1]

hull = cv2.convexHull(cnt)

returnPoints = True,得到以下值:

array([[[192, 135]],

[[ 9, 135]],

[[ 9, 12]],

[[192, 12]]], dtype=int32)

如果想找到凸性缺陷,需要传递returnPoints = False,得到以下结果:

array([[129],

[ 67],

[ 0],

[142]], dtype=int32)

这些是轮廓中相应点的索引,检查第一个值:

cnt[129]

Out[3]: array([[192, 135]], dtype=int32)

与第一个结果相同.

6 检查凸性

cv2.isContourConvex(contour):检查曲线是否凸起

7 外接矩形

7.1 直边外接矩形

它是一个直的矩形,它不考虑对象的旋转。因此,边界矩形的面积不会最小.

cv.boundingRect()

设(x,y)为矩形的左上角坐标,(w,h)为宽度和高度

代码:

import cv2

import numpy as np

img = cv2.imread('img7.png')

imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, thresh = cv2.threshold(imgray, 127, 255, 0)

im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

cnt = contours[0]

x,y,w,h = cv2.boundingRect(cnt)

cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)

cv2.imshow('show',img)

cv2.waitKey()

7.2 最小外接矩形

cv.minAreaRect返回一个Box2D结构,其中包含以下detals - (center(x,y),(width,height),rotation of rotation)

cv.boxPoints画上述矩形.

代码:

rect = cv2.minAreaRect(cnt)

box = cv2.boxPoints(rect)

box = np.int0(box)

cv2.drawContours(img,[box],0,(0,0,255),2)

8 最小封闭圈

(x,y),radius = cv2.minEnclosingCircle(cnt)

center = (int(x),int(y))

radius = int(radius)

cv2.circle(img,center,radius,(0,255,0),2)

9 拟合椭圆

ellipse = cv2.fitEllipse(cnt)

cv2.ellipse(img,ellipse,(0,255,0),2)

10 拟合直线

rows,cols = img.shape[:2]

[vx,vy,x,y] = cv2.fitLine(cnt, cv2.DIST_L2,0,0.01,0.01)

lefty = int((-x*vy/vx) + y)

righty = int(((cols-x)*vy/vx)+y)

cv2.line(img,(cols-1,righty),(0,lefty),(0,255,0),2)

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

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

相关文章

RPM 软件包命名规范

文章目录命名格式示例命名格式 name-version-release.os.arch.rpm,软件名称-版本号-发布次数.适合linux系统.硬件平台.rpm name:程序名称 version:程序版本号 release:用于标识 RPM 包本身的发行号,其实就是软件包…

junit5和junit4_JUnit 5符合AssertJ

junit5和junit4JUnit 5在断言库中带来了很多改进,这主要归功于Java 8和Lambda Expression的支持以及新断言(如assertAll , assertTimeout或assertThrows 。 尽管我非常喜欢JUnit 5,但我相信AssertJ在生产级单元测试中仍然是必不可…

微信html人脸识别接口,微信人脸识别可视化的实现:

实现方式主要通过以下模块实现:DateFromWebChat (从网页版微信窗口下载好友头像)AI (识别模块,主要用于识别好友头像是否为人脸,并且计算人脸的数量与头像的总数且return)DateVisul (数据可视化模块,用与AI模块返回参数的可视化)u…

安卓手机端运行的adb工具_MQTT通信手机端接收生产车间设备运行信息3

应用场景:对车间重点设备的运行参数进行实时跟踪。比如烘干炉的烟囱温度、TNV的出口温度、喷漆室的温湿度、小时产量等等信息。以前这些信息的获取都需要在电脑端获取、相对比较繁琐。这里我们选择在手机端实现获取这些信息。尤其是对于作者这样的设备负责人而言&am…

Linux 命令之 tree -- 以树状图列出目录的内容/查看目录内容

文章目录一、命令介绍二、常用选项三、命令示例(一)按树形结构显示当前目录下的内容(二)按树状图显示当前目录下的所有目录名称而非文件(三)列出指定目录下的第一层级的文件和目录名称(四&#…

jsf 项目_您将在下一个项目中使用JSF吗?

jsf 项目上周有一篇很棒的stackoverflow博客文章,主题是“ Javascript框架的残酷生命周期” 。 这篇文章是关于Javascript UI框架(angularjs,angular,jquery和react)的流行和流行的速度。 这篇文章的关键指标是每月关于…

html 定时刷新 数据,js中,设置定时器 每隔几秒刷新一次页面数据

页面加载进来,查询 然后设置定时器 每隔五秒刷新一次页面数据fnSearch();var interval3setInterval(function(){fnSearch();},5000);function fnSearch(){searchjson.search$(".iptsearch").val();$.ajax({url:/movecheck/getCheckInfo,data:searchjson,…

查询varchar实际大小_微服务和VUE(11): mybatis 动态查询

1. 新建class表和student表:CREATE TABLE class ( class_id varchar(20) NOT NULL, class_name varchar(50) DEFAULT NULL, headmaster_name varchar(20) DEFAULT NULL, headmaster_tel varchar(20) DEFAULT NULL, PRIMARY KEY (class_id)) ENGINEInnoDB …

Linux 中 ctime,mtime,atime 的区别

文章目录改变和修改的区别ctimemtimeatime查看文件时间关于 relatime改变和修改的区别 改变和修改之间的区别在于是改变文件的属性还是改变文件的内容。如果有人说 chmod a-w myfile(删除所有用户对文件 myfile 的写权限),那么这叫改变&…

java迭代器删除两个_两个迭代器的故事

java迭代器删除两个当您查看最流行的Java面试问题时,您可能会遇到有关故障快速和故障安全迭代器的问题: 故障快速迭代器和故障安全迭代器之间有什么区别? 简化的答案是: 如果在迭代过程中修改了集合,则快速失败迭代器…

Linux 命令之 stat -- 显示文件的状态信息

文章目录一、命令介绍二、命令语法三、常用选项四、命令示例(一)显示文件的状态信息(二)以简洁方式输出文件的状态信息(三)显示文件所属的文件系统状态信息一、命令介绍 用于显示文件的状态信息。stat命令…

python tkinter滚动条不起作用_Tkinter滚动条不工作

我有一段运行在python3.4上的tkinter代码,它是一个放在画布上的带有垂直滚动条的大框架,但是滚动条是灰色的,似乎没有与框架的大小相关联。我使用的代码基本上是:class EntryWindow:def __init__(self, master):self.master mast…

大工17秋《计算机文化基础》在线测试1,大工17秋《组织行为学》在线测试1答案...

大工17秋《组织行为学》在线测试1一、单选题:1.根据气质的分类,较适合做推销工作的人员的气质类型是( )。 (满分:3)A.胆汁质B.多血质C.抑郁质D.黏液质正确答案:[hide]——B——[/hide]2.组织行为学在中观层面所要研究的主要内容是( )。 (满分:3)A.个体心…

java分页中显示更多_早期更多失败– Java 8

java分页中显示更多快速失败或早期失败是一种软件工程概念,旨在通过在不应该发生的事情发生时立即停止执行来防止复杂问题的发生。 在之前的博客文章和演示中,我将详细介绍这种方法的优点,在此博客文章中,我将详细介绍Java 8中该思…

计算机组装与维修单招,单招职二 计算机组装与维修试卷.doc

单招职二 计算机组装与维修试卷高二 计算机组装与维修试卷一、填空题(每空1分,共计30分)1.一个完整的计算机系统是由______________和______________两部分组成的。2.为了更好的为CPU散热,在安装风扇前,先在CPU芯片的顶部均匀地涂抹上一层___…

普通人学python好吗_有人问,普通人学python真的有意义吗?看看大家都是怎么说的吧...

普通人学python有意义吗?现在随着python越来越火,尤其是它成为了人工智能的第一编程语言,还被纳入了中小学的教育中。并且python的应用范围很广泛,可以解决很多专业或非专业的问题。但python真的适合普通人学习吗?我个…

Linux 如何安装程序的源代码软件包/源码程序包/源码包?

文章目录一、安装源码包的三个步骤(一)执行命令 configure,进行配置/检测(二)执行命令 make,编译源码(三)执行命令 make install,安装软件二、源码包安装示例&#xff08…

大文件拆分小文件求top_将文件拆分为流

大文件拆分小文件求top上周,我讨论了类Pattern新的(since 1.8)方法splitAsStream只能根据流的需要从字符序列中读取字符序列,并且不能继续进行模式匹配以创建所有可能的元素并返回它作为流。 这种行为是流的本质,它是支…

如何取消ie.html,IE浏览器安全警告怎么关闭

部分用户在使用IE浏览器打开某些页面的时候,可能会出现一个“安全警告”的对话框,虽然影响不大,但是每次出现都让人很烦闷,这个时候你就可以根据下面的操作去关闭这个功能。自从百度近日开启了HTTPS安全网页功能之后,每…

sql 计算两个小数乘积_数学篇|学会这些数学计算技巧,想不满分都难!

计算是小学数学的基础,四则运算和混合运算是计算要考察的重点。在这里我们总结了小学用到的所有计算定律和简便方法,包括运算定律、运算法则、运算顺序和速算技巧四大部分,帮助小学生牢固掌握数学知识点。先赞后看,收获满满&#…