目录:
问题,轮廓找到了,如何去计算对象的弧长与面积(闭合),多边形拟合,几何矩的计算等
(一)对象的弧长与面积
(二)多边形拟合
(三)几何矩的计算
(四)获取图像的外接矩形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
原文:https://www.cnblogs.com/april0315/p/13665111.html