python实现对象测量
目录:
问题,轮廓找到了,如何去计算对象的弧长与面积(闭合),多边形拟合,几何矩的计算等
(一)对象的弧长与面积
(二)多边形拟合
(三)几何矩的计算
(四)获取图像的外接矩形boundingRect和几何距moments
(五)多边形逼近approxPolyDP
(一)对象的弧长与面积
1.步骤:轮廓发现,计算每个轮廓的弧长与面积, 像素单位。
(二)多边形拟合
步骤:
(四)获取图像的外接矩形boundingRect和几何距moments
1 import cv2 as cv
2 import numpy as np
3
4 def measure_object(image):
5 gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY) #转灰度图像
6 ret, binary = cv.threshold(gray,0,255,cv.THRESH_OTSU|cv.THRESH_BINARY_INV) #获取二值化图像
#cv.THRESH_BINARY | cv.THRESH_OTSU 和cv.THRESH_BINARY_INV | cv.THRESH_OTSU(推荐)试一试
7 print("thresold value:",ret)
8 cv.imshow("binary image",binary)
9 outImage,contours,hireachy = cv.findContours(binary,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE)
10 for i,contour in enumerate(contours):
11 area = cv.contourArea(contour) #获取每个轮廓面积
12 x,y,w,h = cv.boundingRect(contour) #获取轮廓的外接矩形
13 rate = min(w,h)/max(w,h) #获取外接矩形宽高比,可以起到一定的筛选作用
14 print("rectangle rate:%s"%rate)
15 mm = cv.moments(contour) #求取轮廓的几何距
16 print(type(mm))
17 print(mm)
18 cx = mm['m10']/mm['m00']
19 cy = mm['m01']/mm['m00'] # 重心坐标
20 cv.circle(image,(np.int(cx),np.int(cy)),2,(0,255,255),-1) #根据几何距获取的中心点,画出中心圆
21 cv.rectangle(image,(x,y),(x+w,y+h),(0,0,255),2) #根据轮廓外接矩形返回数据,画出外接矩形
22 print("contour area:",area)
23 cv.imshow("measure_object",image)
24
25
26 src = cv.imread("./dg.png") #读取图片
27 cv.namedWindow("input image",cv.WINDOW_AUTOSIZE) #创建GUI窗口,形式为自适应
28 cv.imshow("input image",src) #通过名字将图像和窗口联系
29
30 measure_object(src)
31
32 cv.waitKey(0) #等待用户操作,里面等待参数是毫秒,我们填写0,代表是永远,等待用户操作
33 cv.destroyAllWindows() #销毁所有窗口

mm-->{'m02': 3301.25, 'm12': 233530.03333333333, 'm30': 6934377.600000001, 'mu11': -10.721153846156085, 'm21': 1265395.2, 'nu02': 0.08336283484212434, 'm01': 252.5, 'mu30': -12.458842864260077, 'nu21': 0.003451665836783194, 'mu12': 11.46577909273492, 'nu12': 0.006828369938345303, 'mu02': 31.698717948717785, 'mu21': 5.795825115486707, 'm03': 43556.350000000006, 'nu30': -0.007419782588937784, 'm20': 97840.41666666666, 'm00': 19.5, 'm10': 1381.0, 'nu20': 0.09806301522275791, 'mu03': -11.52064431294275, 'm11': 17871.458333333332, 'nu03': -0.0068610445623109115, 'mu20': 37.2884615384537, 'nu11': -0.028195013402119877}
(五)多边形逼近approxPolyDP
1 import cv2 as cv
2 import numpy as np
3
4
5 def measure_object(image):
6 gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY) #转灰度图像
7 ret, binary = cv.threshold(gray,0,255,cv.THRESH_OTSU|cv.THRESH_BINARY) #获取二值化图像
8 cv.imshow("binary image",binary)
9 dst = cv.cvtColor(binary,cv.COLOR_GRAY2BGR)
10 outImage,contours,hireachy = cv.findContours(binary,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE)
11 for i,contour in enumerate(contours):
12 mm = cv.moments(contour) #求取轮廓的几何距
13 cx = mm['m10']/mm['m00']
14 cy = mm['m01']/mm['m00']
15 cv.circle(dst,(np.int(cx),np.int(cy)),2,(0,255,255),-1) #画出中心点
16 approxCurve = cv.approxPolyDP(contour,4,True) #4是与阈值的间隔大小,越小越易找出,True是是否找闭合图像
17 print(approxCurve.shape)
18 if approxCurve.shape[0] >= 7:
19 cv.drawContours(dst,contours,i,(0,255,0),2) #画出轮廓
20 elif approxCurve.shape[0] == 4:
21 cv.drawContours(dst,contours,i,(0,0,255),2)
22 else:
23 cv.drawContours(dst,contours,i,(255,0,0),2)
24
25 cv.imshow("measure_object",dst)
26
27
28 src = cv.imread("./lk.png") #读取图片
29 cv.namedWindow("input image",cv.WINDOW_AUTOSIZE) #创建GUI窗口,形式为自适应
30 cv.imshow("input image",src) #通过名字将图像和窗口联系
31
32 measure_object(src)
33
34 cv.waitKey(0) #等待用户操作,里面等待参数是毫秒,我们填写0,代表是永远,等待用户操作
35 cv.destroyAllWindows() #销毁所有窗口

参考:
https://www.cnblogs.com/ssyfj/p/9276722.html
python实现对象测量的更多相关文章
- Python的对象操作(一)
python支持对象和函数 1. python是解释型语言,逐行运行 2. 对象调用 例子:删除文件的一个例子 2.1 先定义一个类 class MyApp: 2.2 import 引用要用到的模 ...
- python面对对象编程------4:类基本的特殊方法__str__,__repr__,__hash__,__new__,__bool__,6大比较方法
一:string相关:__str__(),__repr__(),__format__() str方法更面向人类阅读,print()使用的就是str repr方法更面对python,目标是希望生成一个放 ...
- Python进阶 - 对象,名字以及绑定
Python进阶 - 对象,名字以及绑定 1.一切皆对象 Python哲学: Python中一切皆对象 1.1 数据模型-对象,值以及类型 对象是Python对数据的抽象.Python程序中所有的数据 ...
- Python 文件对象
Python 文件对象 1) 内置函数 open() 用于打开和创建文件对象 open(name,[,mode[,bufsize]]) 文件名.模式.缓冲区参数 mode: r 只读 w 写入 a 附 ...
- python中对象、类型和元类之间的关系
在python中对象.类型和元类构成了一个微妙的世界. 他们有在这个世界里和平共处,相辅相成.它们遵循着几条亘古不变的定律: 1.python中无处不对象 2.所有对象都有三种特性:id.类型.值 3 ...
- 帮Python找“对象”
引言:你一定会感叹:Python还缺找对象? 毕竟"一切皆对象"是人家Python的哲学理念.不过,Python 允许程序员以纯粹的面向过程的方式来使用它,所以人们有时会忽视它那 ...
- 完全理解 Python 迭代对象、迭代器、生成器(转)
完全理解 Python 迭代对象.迭代器.生成器 本文源自RQ作者的一篇博文,原文是Iterables vs. Iterators vs. Generators » nvie.com,俺写的这篇文章是 ...
- python,可变对象,不可变对象,深拷贝,浅拷贝。
学习整理,若有问题,欢迎指正. python 可变对象,不可变对象 可变对象 该对象所指定的内存地址上面的值可以被改变,变量被改变后,其所指向的内存地址上面的值,直接被改变,没有发生复制行为,也没有发 ...
- 完全理解 Python 迭代对象、迭代器、生成器
完全理解 Python 迭代对象.迭代器.生成器 2017/05/29 · 基础知识 · 9 评论 · 可迭代对象, 生成器, 迭代器 分享到: 原文出处: liuzhijun 本文源自RQ作者 ...
随机推荐
- 学习Tomcat(六)之类加载器
通过前面的文章我们知道,Tomcat的请求最终都会交给用户配置的servlet实例来处理.Servlet类是配置在配置文件中的,这就需要类加载器对Servlet类进行加载.Tomcat容器自定义了类加 ...
- 设置 SSH 命令行空闲保持会话
楔子 使用 Mac 或 Linux 原生的命令行 ssh user@ip 方式连接 Linux 闲时会自动断开终端卡死. 为解决这个问题,查了到篇博客翻译下关键步骤记录下来.解决方式可以分服务端设置和 ...
- openlayer 4326与3857坐标互转之Java版
public class Transform { private static final double PI = Math.PI; private static final double merca ...
- 开放下载!2021 解锁 Serverless 从入门到实战大“橙”就
Serverless 架构即将引领云计算的下一个十年已成行业共识.处于变革中的开发者,大多已从观望状态转向尝试阶段, 越来越多 Serverless 落地场景被解锁. "Serverless ...
- 复杂对象List集合的排序
对于集合的排序,直接的有sort().间接的有借用compareTo.Comparable等,但是对于相对复杂的对象集合,还得自己实现方法来处理. 现在有这样一个思路: 第一步:从需要排序的对象集合中 ...
- NOIP模拟79
T1 F 解题思路 因为每个点会产生贡献当且仅当它在可以到他的点之前被删除,并且此题遵守期望的线性性. 因此设所有可以到达点 \(i\) 的数量为 \(c_i\) 那么答案就是 \(\sum \fra ...
- ToString()字符串转换你用正确了吗?
前言 在开发中,ToString()这个方法太方便了,以致于误解大家转换时都是直接Object.ToString()直接转换, 其实不然, 一般都是转之前先判断是否为null后再进行转换,否则会直接报 ...
- 【JAVA】【作业向】第一题:本学期一班级有n名学生,m门课程。现要求对每门课程的成绩进行统计:平均成绩、最高成绩、最低成绩,并统计考试成绩的分布律。
1.预备知识:动态数组Array实现: 2.解题过程需要理解的知识:吧唧吧唧吧唧吧唧 不想做了 就用了最简单的方法 和c语言类似 java版本 `import java.util.Scanner; / ...
- 分库分表利器之Sharding Sphere(深度好文,看过的人都说好)
Sharding-Sphere Sharding-JDBC 最早是当当网内部使用的一款分库分表框架,到2017年的时候才开始对外开源,这几年在大量社区贡献者的不断迭代下,功能也逐渐完善,现已更名为 S ...
- Noip模拟58 2021.9.21(中秋祭&&换机房祭)
第一次在学校过中秋节,给家里人视频电话,感觉快回家了很开心, 然后还吃了汉堡喝饮料非常爽,颓废了一会儿还换了新机房,$Linux2.0$非常dei,少爷机也非常快, 发现好像测评机又成了老爷机,这就是 ...