OpenCV车牌检测报错:detectMultiScale函数断言失败!empty()
车牌检测提取失败的问题与解决方法
问题描述
尝试通过以下代码实现车牌检测,但提取车牌时失败,执行代码:
plate_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'https://raw.githubusercontent.com/SarthakV7/AI-based-indian-license-plate-detection/master/indian_license_plate.xml') def detect_plate(img, text=''): plate_img = img.copy() roi = img.copy() plate_rect = plate_cascade.detectMultiScale(plate_img, scaleFactor = 1.2, minNeighbors = 7) # detects numberplates and returns the coordinates and dimensions of detected license plate's contours. for (x,y,w,h) in plate_rect: roi_ = roi[y:y+h, x:x+w, :] plate = roi[y:y+h, x:x+w, :] cv2.rectangle(plate_img, (x+2,y), (x+w-3, y+h-5), (51,181,155), 3) if text!='': plate_img = cv2.putText(plate_img, text, (x-w//2,y-h//2), cv2.FONT_HERSHEY_COMPLEX_SMALL , 0.5, (51,181,155), 1, cv2.LINE_AA) return plate_img, plate # returning the processed image. # Testing the above function def display(img_, title=''): img = cv2.cvtColor(img_, cv2.COLOR_BGR2RGB) fig = plt.figure(figsize=(10,6)) ax = plt.subplot(111) ax.imshow(img) plt.axis('off') plt.title(title) plt.show() img = io.imread('https:///automatic-giggle/cef27d2274a17835ac4b9c044382131e0fba139d/car_test.jpeg') display(img, 'input image') # Getting plate prom the processed image output_img, plate = detect_plate(img)
收到错误信息(已翻译):
错误:OpenCV(4.6.0) /io/opencv/modules/objdetect/src/cascadedetect.cpp:1689: 错误: (-215:断言失败) !empty() 在函数 'detectMultiScale' 中
问题原因
这个错误的核心是分类器文件未成功加载:
- OpenCV的
CascadeClassifier不支持直接加载网络URL的文件,只能读取本地文件或本地路径 - 代码中将网络URL拼到
cv2.data.haarcascades(本地级联分类器目录)后,导致加载失败,plate_cascade为空,调用detectMultiScale时触发断言错误
另外代码还存在潜在问题:如果未检测到车牌,plate变量未初始化,返回时会报错。
解决步骤
1. 下载分类器文件到本地
手动下载印度车牌检测的XML分类器文件,保存到项目所在目录。
2. 修改代码加载本地分类器
替换分类器加载代码,使用本地文件路径:
plate_cascade = cv2.CascadeClassifier('indian_license_plate.xml')
3. 修复变量初始化问题
在detect_plate函数中初始化plate变量,避免未检测到车牌时返回未定义变量。
完整修正后的代码
import cv2 import matplotlib.pyplot as plt from skimage import io # 加载本地的印度车牌分类器 plate_cascade = cv2.CascadeClassifier('indian_license_plate.xml') def detect_plate(img, text=''): plate_img = img.copy() roi = img.copy() plate = None # 初始化plate变量 plate_rect = plate_cascade.detectMultiScale(plate_img, scaleFactor=1.2, minNeighbors=7) for (x, y, w, h) in plate_rect: plate = roi[y:y+h, x:x+w, :] cv2.rectangle(plate_img, (x+2, y), (x+w-3, y+h-5), (51,181,155), 3) if text != '' and plate is not None: plate_img = cv2.putText(plate_img, text, (x - w//2, y - h//2), cv2.FONT_HERSHEY_COMPLEX_SMALL, 0.5, (51,181,155), 1, cv2.LINE_AA) return plate_img, plate def display(img_, title=''): img = cv2.cvtColor(img_, cv2.COLOR_BGR2RGB) fig = plt.figure(figsize=(10,6)) ax = plt.subplot(111) ax.imshow(img) plt.axis('off') plt.title(title) plt.show() # 确保本地存在car_test.jpeg图像,或替换为正确的图像路径 img = io.imread('car_test.jpeg') display(img, '输入图像') output_img, plate = detect_plate(img) # 检测到车牌时显示结果 if plate is not None: display(plate, '提取到的车牌')
额外注意事项
- 确保图像文件
car_test.jpeg存在于本地项目目录,或使用正确的本地/网络路径 - 若分类器仍加载失败,检查文件路径是否正确,或重新下载分类器文件
内容的提问来源于stack exchange,提问作者asaetrang
相关产品推荐
相关产品推荐

