我是靠谱客的博主 坚强鸵鸟,最近开发中收集的这篇文章主要介绍button显示文字_(四十九)车牌识别之界面(Tkinter + OpenCV显示Picture和Video),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

v2-2f3e3768e6f90cd5bb886765ec529c23_1440w.jpg?source=172ae18b

时间为友,记录点滴。

罗胖今年的跨年演讲不多做一些能引起共鸣的19年总结,而给自己导流量的动作太明显,加上言控管论,很多话题又不敢碰,我还挺担心他20场怎么熬过来。


9012年过去了,看了看三个专栏,今年下半年也算留下了痕迹。OpenCV已经慢慢有了近50篇的内容。虽然我们已经通过SVM/Adaboost撕开了机器学习的小口子,但是距离现在大热的神经网络还遥遥无期,不过这也说明我们这个专栏还有很大的潜力嘛。

为了总结、检验一下自己的2019,我觉得可以写一个体量稍微大点的实例,糅合尽可能多的前面讲过的内容。在网上找来找去,不如写一个即成熟又陌生的车牌识别

需求分析:

我想要做的车牌识别应该包含两大块:

  • UI
  • 算法

其中UI部分应该做到简明,但至少应该有:

  • 图片/视频显示区
  • 车牌/车牌颜色输出区
  • 照片/视频加载按钮

于是我粗略得画了个草图:

v2-5a05b5a54e75d61362ae46ef8366966d_b.jpg

算法部分在网上多看了几篇帖子,大部分都是用了DNN/ANN神经网络,但我还是想用我们前面学过的知识来试试,不过大家的思路都差不多,这个完全可以借鉴:

  • 车牌定位
  • 字符分割
  • 文字识别

画一张总图:

v2-4244963b5d97b8d9b0bbc62ad2982335_b.jpg

图形界面开发

本篇只介绍图形界面开发。

遇到的第一个问题就是选择什么开发语言和技术。因为我之前用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外部库

v2-4ffe1971e79de25f1436d8ac80c5af41_b.jpg

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 

输出效果:

  • 原始画面

v2-45ba420b6a3c4781a2b9d0129e6f78fc_b.jpg
  • 显示图片

v2-7c63422a5152f8bdd810f88ac9fc204a_b.jpg
  • 通过摄像头获取Video

v2-1fb12ebdac9a739510d8333262bf88f5_b.jpg

最后

以上就是坚强鸵鸟为你收集整理的button显示文字_(四十九)车牌识别之界面(Tkinter + OpenCV显示Picture和Video)的全部内容,希望文章能够帮你解决button显示文字_(四十九)车牌识别之界面(Tkinter + OpenCV显示Picture和Video)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部