首页 > 编程语言 > 详细

python实现对象测量

时间:2020-09-14 12:40:32      阅读:69      评论:0      收藏:0      [点我收藏+]

 

目录:

问题,轮廓找到了,如何去计算对象的弧长与面积(闭合),多边形拟合,几何矩的计算等

(一)对象的弧长与面积

(二)多边形拟合

(三)几何矩的计算

(四)获取图像的外接矩形boundingRect和几何距moments

(五)多边形逼近approxPolyDP

 

 

(一)对象的弧长与面积

1.步骤:轮廓发现,计算每个轮廓的弧长与面积, 像素单位。

(二)多边形拟合

步骤:

A.获取轮廓的多边形拟合结果
B.approxPolyDP
- contour
- epsilon越小越折线越逼近真实形状
- close – 是否为闭合区域
 
(三)几何矩的计算
技术分享图片

 (四)获取图像的外接矩形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实现对象测量

原文:https://www.cnblogs.com/april0315/p/13665111.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!