概述
时间为友,记录点滴。
罗胖今年的跨年演讲不多做一些能引起共鸣的19年总结,而给自己导流量的动作太明显,加上言控管论,很多话题又不敢碰,我还挺担心他20场怎么熬过来。
9012年过去了,看了看三个专栏,今年下半年也算留下了痕迹。OpenCV已经慢慢有了近50篇的内容。虽然我们已经通过SVM/Adaboost撕开了机器学习的小口子,但是距离现在大热的神经网络还遥遥无期,不过这也说明我们这个专栏还有很大的潜力嘛。
为了总结、检验一下自己的2019,我觉得可以写一个体量稍微大点的实例,糅合尽可能多的前面讲过的内容。在网上找来找去,不如写一个即成熟又陌生的车牌识别。
需求分析:
我想要做的车牌识别应该包含两大块:
- UI
- 算法
其中UI部分应该做到简明,但至少应该有:
- 图片/视频显示区
- 车牌/车牌颜色输出区
- 照片/视频加载按钮
于是我粗略得画了个草图:
算法部分在网上多看了几篇帖子,大部分都是用了DNN/ANN神经网络,但我还是想用我们前面学过的知识来试试,不过大家的思路都差不多,这个完全可以借鉴:
- 车牌定位
- 字符分割
- 文字识别
画一张总图:
图形界面开发
本篇只介绍图形界面开发。
遇到的第一个问题就是选择什么开发语言和技术。因为我之前用Python做过Tkinter的小东西,所以这次还是用Python Tkinter + OpenCV来搞吧。
这里面需要注意几个地方:
1. Tkinter 的布局
1.1 继承
我使用了class LPRSurface(Tk):类来继承Tk,如果是这样写需要在init函数中做做super().__init__()来实现对父类的初始化。
1.2 排版
我使用了界面定宽高的方式,所以把整个界面fix大小,并且规定好了
- label:显示区域
- Entry:输出区域
- Button:按钮区域的大小和位置
使用了place而非pack。
1.3 更新
- 图片的更新只需要重新config label的image即可,但是这里要注意image一定要用self修饰,否则就会出现资源被回收,图片无法正常加载的问题。 self.labelPic.configure(image = self.imgOri, bg="pink")
- Video的更新则需要借助threading模块,重新创建线程了。
2. 路径记忆
使用了一个单独的类来记录打开过的图片路径,把这个路径存储在注册表中(这样做对Linux支持不好。。。).
需要借助winreg外部库
2.1 创建注册表
winreg.CreateKey(winreg.HKEY_CURRENT_USER, r"Software{}LPR".format(getpass.getuser()))
2.2 写入注册表
winreg.SetValueEx(key, "LPR", 0, winreg.REG_SZ, path)
2.3 读出注册表
winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software{}LPR".format(getpass.getuser()))
winreg.QueryValueEx(key, "LPR")
3. OpenCV显示
3.1 格式转换
- 还记得OpenCV是反人类的BGR排列吗?可以用cv.cvtColor把OpenCV read出来的图片转换成普通的RGB。
- 然后再转换成Tkinter可以显示的数据格式,送给label中的image
imgCVRGB = cv.cvtColor(imgCV, cv.COLOR_BGR2RGB)
img = Image.fromarray(imgCVRGB)
imgTK = ImageTk.PhotoImage(image=img)
3.2 显示自适应
如果图片没有Tkinter的Lable大,则正常显示,否则就要等比例缩放,以保障整张图片可以在Lable显示完全。
widthScale = 1.0*self.labelPicWidth/picWidth
heightScale = 1.0*self.labelPicHeight/picHeight
scale = min(widthScale, heightScale)
resizeWidth = int(picWidth*scale)
resizeHeight = int(picHeight*scale)
img = img.resize((resizeWidth, resizeHeight), Image.ANTIALIAS)
3.3 Thread中的延迟
竟然可以用小数!
time.sleep(0.03)
全部代码:
from
输出效果:
- 原始画面
- 显示图片
- 通过摄像头获取Video
最后
以上就是坚强鸵鸟为你收集整理的button显示文字_(四十九)车牌识别之界面(Tkinter + OpenCV显示Picture和Video)的全部内容,希望文章能够帮你解决button显示文字_(四十九)车牌识别之界面(Tkinter + OpenCV显示Picture和Video)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复