百度搜了一个改了下,可以试试看
import cv2
img=cv2.imread("./1.jpg")#读图
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #转灰度图
_,img_binary=cv2.threshold(gray,220,240,cv2.THRESH_BINARY) #阈值分割
opening = cv2.morphologyEx(img_binary, cv2.MORPH_OPEN, (3, 3)) #开运算
closing = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, (3, 3)) #闭运算
crs,t = cv2.findContours(closing,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) #找边
cv2.drawContours(img,crs,-1,(0,0,255),3) #绘制轮廓
rectangle, diamond, ellipse, star=0, 0, 0, 0 #个数初始值
for c in crs:
if(cv2.contourArea(c, True)>100): #排除整个图像的矩形框
cnt_len = cv2.arcLength(c, True) #计算轮廓周长
cnt = cv2.approxPolyDP(c, 0.02*cnt_len, True) #多边形逼近
if(len(cnt)==10): #五角星
star+=1
elif(len(cnt)==4): #四边形
a=cv2.minAreaRect(c)
if(abs(a[1][0]*a[1][1]-cv2.contourArea(cnt))/cv2.contourArea(cnt)>0.1): #根据四边形面积和最小外界矩形面积是否相近来判断是矩形还是菱形
diamond+=1
else:
rectangle+=1
else: #其余图形
ellipse+=1
print(f" 矩形个数为{rectangle}\n",f"菱形个数为{diamond}\n",f"椭圆个数为{ellipse}\n",f"五角星个数为{star}\n", end="")
cv2.imshow("img", img)
cv2.waitKey(0)