Files
password_try/cv2_test.py
2025-03-01 23:49:41 +08:00

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)