43 lines
1.6 KiB
Python
43 lines
1.6 KiB
Python
import cv2
|
|
import numpy as np
|
|
|
|
|
|
|
|
|
|
|
|
#定义形状检测函数
|
|
def ShapeDetection(img:cv2.typing.MatLike):
|
|
contours,hierarchy = cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE) #寻找轮廓点
|
|
all_cont=len(contours)
|
|
# print(f"all_cont:{all_cont}")
|
|
boll_count=0
|
|
for obj in contours:
|
|
perimeter = cv2.arcLength(obj,True) #计算轮廓周长
|
|
approx = cv2.approxPolyDP(obj,0.02*perimeter,True) #获取轮廓角点坐标
|
|
# CornerNum = len(approx) #轮廓角点的数量
|
|
# area = cv2.contourArea(obj) #计算轮廓内区域的面积
|
|
# print(f"area:{area}, perimeter:{perimeter}, CornerNum:{CornerNum}")
|
|
x, y, w, h = cv2.boundingRect(approx) #获取坐标值和宽度、高度
|
|
# print(f"{x},{y},{x+w},{y+h}")
|
|
img_obj=img[y:y+h,x:x+w]
|
|
# print(img_obj)
|
|
nonzero_num=np.count_nonzero(img_obj)
|
|
percentage=nonzero_num/img_obj.size
|
|
# print(f"nonzero_num:{nonzero_num},size={img_obj.size}, pos:{percentage}")
|
|
# 通过计算图像白值的比例来判断实心还是空心
|
|
if(percentage>0.55):
|
|
boll_count+=1
|
|
return (all_cont,boll_count)
|
|
|
|
def calc_boll_count(path:str):
|
|
img = cv2.imread(path)
|
|
imgGray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY) # 转为灰度图
|
|
ret, binary = cv2.threshold(imgGray,60,255,cv2.THRESH_BINARY) # 转为二值图
|
|
return ShapeDetection(binary) #形状检测
|
|
|
|
if __name__ == "__main__":
|
|
ret=calc_boll_count("1.png")
|
|
print(ret)
|
|
ret=calc_boll_count("1644-440 172x27.png")
|
|
print(ret)
|