我在opencvPython的帮助下编写了可识别汽车牌照的代码。为此,我使用了haarcascades。我从这里下载了haarcascades(如果您有更好的资源,请告诉我):

https://github.com/opencv/opencv/tree/master/data/haarcascades

这是图像:

python - 使用haarcascade通过OpenCV和Python检测车牌-LMLPHP

当我处理第一个高射级联时,它仅检测到右车*(两次)上的车牌,但无法识别白车上的车牌。

当我第二次练习时,它给我一个错误,我不知道它是什么意思以及如何解决它,这是错误:

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/

10-12 19:29