本人初学opencv使用4.6,写demo时遇到一点问题,还请各位帮忙解答
import numpy as np
import cv2
import math
font = cv2.FONT_HERSHEY_SIMPLEX
def cv_show(name,img):
cv2.imshow(name, img)
cv2.waitKey(0)
cv2.destroyAllWindows()
def open_image(image):
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
image = cv2.dilate(image, kernel)
image = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)
# image = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)
return image
warped = cv2.imread(r"D:\Pictures\picture\photo3.jpg")
hsv_img = cv2.cvtColor(warped, cv2.COLOR_BGR2HSV)
white_circle_num = 0
white_rect_num = 0
lower_white = np.array([75, 0, 158]) # 颜色范围低阈值
upper_white = np.array([118, 64, 247]) # 颜色范围高阈值
mask_white = cv2.inRange(hsv_img, lower_white, upper_white) # 根据颜色范围删选
mask_white = cv2.GaussianBlur(mask_white, (5, 5), 0) # 中值滤波
mask_white = open_image(mask_white)
print(mask_white.shape)
# mask_white = cv2.threshold(mask_white, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
# cv2.imwrite('mask_white.jpg', mask_white)
mask_white = cv2.Canny(mask_white, 75, 200)
cv_show('mask_white', mask_white)
print(1)
contours4 = cv2.findContours(mask_white, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[0]
# contours4 = sorted(contours4, key=cv2.contourArea, reverse=True)[:7]
print(2)
for cnt4 in range(len(contours4)):
print(5)
area = cv2.contourArea(cnt4)
print(3)
center, radius = cv2.minEnclosingCircle(cnt4) # 圆心半径
print(4)
print(radius)
rate = area / (math.pi * radius * radius)
if radius > 100 and radius < 160:
print(radius)
if rate >= 0.9:
cv2.circle(warped, (int(center[0]), int(center[1])), int(radius), (255, 255, 0), 2)
cv2.putText(warped, 'white_circle', (int(center[0]), int(center[1])), font, 1, (0, 255, 0), 2)
white_circle_num += 1
elif rate > 0.6 and rate < 0.9:
rect = cv2.minAreaRect(cnt4)
box = cv2.boxPoints(rect)
box = np.int0(box)
# cv2.circle(img,(int(center[0]),int(center[1])),int(radius),(255,0,255),5)
warped = cv2.drawContours(warped, [box], 0, (255, 255, 0), 2)
cv2.putText(warped, 'white_rect', (int(center[0]), int(center[1])), font, 1, (0, 255, 0), 2)
white_rect_num += 1
cv_show("white_dect", warped)