我在opencv
和Python
的帮助下编写了可识别汽车牌照的代码。为此,我使用了haarcascades。我从这里下载了haarcascades(如果您有更好的资源,请告诉我):
https://github.com/opencv/opencv/tree/master/data/haarcascades
这是图像:
当我处理第一个高射级联时,它仅检测到右车*(两次)上的车牌,但无法识别白车上的车牌。
当我第二次练习时,它给我一个错误,我不知道它是什么意思以及如何解决它,这是错误:
cascadedetect.cpp:567: error: (-2:Unspecified error) in function 'bool __thiscall cv::HaarEvaluator::Feature::read(const class cv::FileNode &,const class cv::Size_<int> &)'
> Invalid HAAR feature (expected: 'rw.r.x < W'), where
> 'rw.r.x' is 32
> must be less than
> 'W' is 16
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:\Users\nenad\OneDrive\Desktop\open cv slika\Tablice\tablica.py", line 14, in <module>
plates_cascade = cv2.CascadeClassifier('haarcascade_licence_plate_rus_16stages.xml')
SystemError: <class 'cv2.CascadeClassifier'> returned a result with an error set
我认为问题不在于这些叶栅级联有俄罗斯车牌,我在网上看到了很多,俄罗斯车牌看起来与其他车牌相似。
这是我写的代码:
# Standard imports
import cv2
import numpy as np
# Read image
img = cv2.imread("slika2.jpg", 1)
gray = cv2.cvtColor(img, 0)
cv2.imshow('img', gray)
cv2.waitKey(0)
#read haarcascade
#plates_cascade = cv2.CascadeClassifier('haarcascade_russian_plate_number.xml') #does not give me error, but result is not correct
plates_cascade = cv2.CascadeClassifier('haarcascade_licence_plate_rus_16stages.xml') #gives me error
plates = plates_cascade.detectMultiScale(gray, 1.2, 4)
for (x,y,w,h) in plates:
#detect plate with rectangle
#rec. start point (x,y), rec. end point (x+w, y+h), blue color(255,0,0), line width 1
plates_rec = cv2.rectangle(img, (x,y), (x+w, y+h), (0,255,0), 1)
#cv2.putText(plates_rec, 'Text', (x, y-3), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 1)
gray_plates = gray[y:y+h, x:x+w]
color_plates = img[y:y+h, x:x+w]
#cv2.imshow('img', gray_plates)
#cv2.waitKey(0)
height, width, chanel = gray_plates.shape
print(height, width)
cv2.imshow('img', img)
cv2.waitKey(0)
print('Number of detected licence plates:', len(plates))
有什么建议可以改善我的代码并解决此问题?
另外,如果您能告诉我如何创建自己的haar级联,我已经遍及整个网络,但是找不到任何可行的解决方案。
最佳答案
发生错误是因为在* .xml重量文件的开头中指定了大小。诸如此类的内容(在非注释行的开头)
<size> H W </size>
现在,如果您读懂了该错误,则该操作相当直观,只需将W的值(对于您的情况,因为宽度出现错误)更改为32或更大,(我不是很清楚如果您随机设置较高的值,则对性能有影响,但可以确保不会产生任何错误,因此最好将值设置为32。
这是一个快速的技巧,尽管它没有解释为什么在创建* .xml文件的过程中会发生如此大小的差异
关于python - 使用haarcascade通过OpenCV和Python检测车牌,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58710201/