做基于opencv的识别中国车牌,用python敲代码
时间: 2023-05-24 17:04:36 浏览: 188
下面给出一个基于OpenCV和Python的识别中国车牌的代码,可能需要用到一些PyPI上的库:
- opencv-python
- imutils
- pytesseract
具体安装方式可以参考README
```
import cv2
import imutils
import pytesseract
# 1. 读取图片
img = cv2.imread('test.jpg')
# 2. 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 3. 高斯模糊去噪
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
# 4. 边缘检测
edged = cv2.Canny(blurred, 100, 200)
# 5. 寻找轮廓
cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
# 6. 过滤小区域的轮廓
cnts = [c for c in cnts if cv2.contourArea(c) > 1000]
# 7. 距离仿射变换来获取车牌区域图像
plate = None
for c in cnts:
# 计算轮廓逼近的多边形
peri = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.02 * peri, True)
# 如果近似多边形为4,则找到了车牌区域
if len(approx) == 4:
plate = approx
break
if plate is not None:
# 获取车牌区域图像
plate = imutils.resize(plate, width=400)
# 遮罩,获取车牌区域
mask = np.zeros(gray.shape, dtype=np.uint8)
cv2.drawContours(mask, [plate], -1, 255, -1)
mask = cv2.bitwise_and(gray, mask)
# 二值化处理
thresh = cv2.threshold(mask, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
# 执行OCR识别
text = pytesseract.image_to_string(thresh, lang='chi_sim+eng', config='--psm 7')
# 输出识别结果
print("车牌号码为:", text)
else:
print("未能检测到车牌区域")
```
代码中第1步读取了图片。
第2步将图片灰度化,方便处理。
第3步为高斯模糊去噪。
第4步进行边缘检测。
第5步使用cv2.findContours函数寻找图像的轮廓。
第6步对得到的轮廓进行过滤,保留比较大的区域。
第7步使用cv2.approxPolyDP函数对轮廓多边形逼近,如果逼近后的多边形为4,就认为找到了车牌区域,然后对车牌区域执行距离仿射变换,获取车牌图像。
之后,我们需要遮罩,将其他区域都涂黑来保留车牌区域图像。具体的实现方式是先用cv2.drawContours函数画出车牌区域的轮廓,然后将剩下的区域涂黑。接下来,将车牌区域图像二值化,方便执行OCR识别。
最后,我们使用pytesseract库进行OCR识别,识别的语言类型为中文和英文,输出识别结果。如果没有检测到车牌区域,则输出未能检测到车牌区域的提示。
阅读全文