import cv2
watch_cascade = cv2.CascadeClassifier(r’C:\Users\ASUS\Desktop\opencv_car\cascade.xml’)
def detectPlateRough(image_gray, resize_h=720, en_scale=1.08, top_bottom_padding_rate=0.05):
print("resize_h = ",resize_h)
count = 0
if top_bottom_padding_rate > 0.2:
print("error:top_bottom_padding_rate > 0.2:", top_bottom_padding_rate)
exit(1)
height = image_gray.shape[0]
padding = int(height * top_bottom_padding_rate)
print("padding = ", padding)
# scale = image_gray.shape[1] / float(image_gray.shape[0])
print("image_gray.shape[1] =",image_gray.shape[1])
# print("int(scale * resize_h) =", int(scale * resize_h))
image = cv2.resize(image_gray, (image_gray.shape[1], resize_h))
# 切掉图像上下各0.05*resize_h
image_color_cropped = image[padding:resize_h, 0:image_gray.shape[1]]
cv2.imshow("imageShow", image_color_cropped)
cv2.waitKey(0)
image_gray = cv2.cvtColor(image_color_cropped, cv2.COLOR_RGB2GRAY)
# 36,9 中36改的是列,9改的是行的最小值
watches = watch_cascade.detectMultiScale(image_gray, en_scale, 2, minSize=(36, 9), maxSize=(36 * 5, 9 * 5))
cropped_images = []
cv2.imwrite(str(count) + ".jpg", image_color_cropped, [int(cv2.IMWRITE_JPEG_QUALITY), 100])
for (x, y, w, h) in watches:
# cv2.rectangle(image_color_cropped, (x, y), (x + w, y + h), (0, 0, 255), 1)
x -= w * 0.14
w += w * 0.28
y -= h * 0.5
h += h * 1
print(x,w,y,h)
# cv2.rectangle(image_color_cropped, (int(x), int(y)), (int(x + w), int(y + h)), (0, 0, 255), 1)
cropped = cropImage(image_color_cropped, (int(x), int(y), int(w), int(h)))
# 取出车牌图像
cv2.imwrite(str(count) + ".jpg", cropped, [int(cv2.IMWRITE_JPEG_QUALITY), 100])
count += 1
# print("cropped.shape[0]",cropped.shape[0])
# print("cropped.shape[1]", cropped.shape[1])
cropped_images.append([cropped, [x, y + padding, w, h]])
return cropped_images
def cropImage(image, rect):
# cv2.imshow(“imageShow”, image)
# cv2.waitKey(0)
x, y, w, h = computeSafeRegion(image.shape, rect)
cv2.imshow(“imageShow”, image[y:y + h, x:x + w])
cv2.waitKey(0)
return image[y:y + h, x:x + w]
def computeSafeRegion(shape, bounding_rect):
top = bounding_rect[1] # y
bottom = bounding_rect[1] + bounding_rect[3] # y + h
left = bounding_rect[0] # x
right = bounding_rect[0] + bounding_rect[2] # x + w
min_top = 0
max_bottom = shape[0]
min_left = 0
max_right = shape[1]
# print(left,top,right,bottom)
# print(max_bottom,max_right)
if top < min_top:
top = min_top
if left < min_left:
left = min_left
if bottom > max_bottom:
bottom = max_bottom
if right > max_right:
right = max_right
return [left, top, right - left, bottom - top]
image = cv2.imread(r"C:\Users\ASUS\Desktop\222.jpg")
images = detectPlateRough(image, image.shape[0], top_bottom_padding_rate=0.1)
print(“检测到车牌数”, len(images))
https://blog.csdn.net/ctwy291314/article/details/80893455