python+pyhyper实现识别图片中的车牌号思路详解
作者:月月吃喝
背景
最近领导给布置了一个基于图片识别车牌号的工具开发任务,然后就去研究实现逻辑,自己根据opencv写了一个小demo,发现不仅速度慢而且成功率极低。然后,就找到了Hyperlpr开源项目。
环境搭建
排雷1:有教程说在github上下载源码:https://github.com/zeusees/HyperLPR,自己编译,结果github上已经停止维护了,然后再gitee找到了:Hyperlpr项目
排雷2:hyperlpr环境搭建比较苛刻,建议直接在requirements.txt文件中维护好版本号
实现:
我是直接pip install hyperlpr
安装的
验证
import cv2 from hyperlpr import HyperLPR_plate_recognition if __name__ == '__main__': image = cv2.imread("one.jpeg") result = HyperLPR_plate_recognition(image)
报错:
mat_ = cv2.estimateRigidTransform(org_pts, target_pts, True)
AttributeError: module 'cv2' has no attribute 'estimateRigidTransform'
修改hyperlpr.py文件,大概在231行
将mat_ = cv2.estimateRigidTransform(org_pts, target_pts, True)
修改为
mat_,inlier = cv2.estimateAffine2D(org_pts, target_pts)
再次执行,执行成功,返回一个列表,依次是车牌号,准确率,车牌号在图片中的坐标
二次开发
经过实验发现,如果图片中存在多个车牌号,只能识别图片中的一个车牌号
拜读源码发现self.detect_ssd(image)
函数返回的是一个可迭代变量,追踪进去应该可以发现点东西
和猜测一致,self.detect_ssd(image)返回的是一个列表,但是找到一个车牌就返回了,只需要将 return cropped_images
放到for循环外卖外面即可
修改前:
修改后:
验证:
标记
附源码:
import cv2 import numpy as np from PIL import ImageFont, Image, ImageDraw from hyperlpr import HyperLPR_plate_recognition if __name__ == '__main__': image = cv2.imread("two.jpeg") result = HyperLPR_plate_recognition(image) print(result) # 标记车牌号 if result: for index, item in enumerate(result): # 车牌号 car_code = item[0] # 可信度 conf = item[1] # 车牌框左上角坐标 pt1 = (item[2][0], item[2][1]) # 车牌框右下角坐标 pt2 = (item[2][2], item[2][3]) # 绘制车牌框 cv2.rectangle(image, pt1=pt1, pt2=pt2, color=(255, 0, 0), thickness=3) # 设置需要显示的字体 font_path = 'fonts/simsun.ttc' font = ImageFont.truetype(font_path, size=40, index=1) image = Image.fromarray(image) draw = ImageDraw.Draw(image) # 绘制文字信息 draw.text((pt1[0] + 30, pt1[1] - 30), car_code, font=font, fill=(0, 0, 255)) image = np.array(image) # cv2.namedWindow('image', 0) # cv2.imshow('image', image) # cv2.waitKey(100000) cv2.imwrite('d:/two.jpeg', image)
到此这篇关于python+pyhyper实现识别图片中的车牌号的文章就介绍到这了,更多相关python车牌号识别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!