sg.Column(image_viewer_column),
]
]
window = sg.Window("人像添加圣诞帽软件", layout)
filename = ''
while True:
event, values = window.read()
if event == "Cancel" or event == sg.WIN_CLOSED:
break
if event == "-FOLDER-":
folder = values["-FOLDER-"]
try:
file_list = os.listdir(folder)
except:
file_list = []
fnames = [
f
for f in file_list
if os.path.isfile(os.path.join(folder, f))
and f.lower().endswith((".jpg", ".png"))
]
window["-FILE LIST-"].update(fnames)
elif event == "-FILE LIST-":
try:
filename = os.path.join(values["-FOLDER-"], values["-FILE LIST-"][0])
if filename.endswith('.jpg'):
im = cv2.imread(filename)
cv2.imwrite(filename.replace('jpg', 'png'), im)
window["-IMAGE-"].update(filename=filename.replace('jpg', 'png'))
except Exception as e:
print(e)
elif event == "Go":
try:
# output = add_hat(filename)
# 展示效果
# cv2.imshow("output",output)
# cv2.waitKey(0)
# cv2.imwrite("output.png",output)
# print(output)
window["-IMAGE-"].update(filename='output.png')
except:
print('OMG!添加失败了!')
cv2.destroyAllWindows()
这里我选用的是 PySimpleGUI 框架来做的,比较简单 。界面分为左右两部分,左边是两个按钮(确定和取消)加一个文件夹选择器,再加一个图片文件列表;右边是一个图片展示框 。
左边选择文件夹后,会在下方列出文件夹里包含 .png 和 .jpg 的图片列表 。点击图片列表中的图片,会在右边显示你所选择的图片 。这个选中的图片也就是我们后面需要添加圣诞帽的图片 。
这里需要注意的是,PySimpleGUI 的图片展示默认只支持 png 格式的,所以我在展示的时候做了判断,如果是 jpg 格式的图片,我就用 cv2 将其转换成 png 格式,然后再进行展示 。
到这里,我们的关键步骤就完成了 。接下来就是将我们两部分代码进行整合 。其实也很简单,只需要在 GUI 界面上用户点击 “生成” 按钮时,后台接收到图片的路径,传递给我们的图片处理函数,在处理完后将图片保存在文件夹下,并更新 GUI 界面右边的展示的图片即可 。
最终的运行效果:
打包软件
打包软件我们还是用熟悉的 pyinstaller 模块,将代码打包成可执行的 exe 格式 。
首先下载我们所需的模块包:
pip install pyinstaller
接着在命令行敲下打包命令:
pyinstaller christmashat.py
这个 christmashat.py 就是我们所写的程序了 。
打包比较耗时,耐心等着就行 。打包完成后,在我们代码的目录下会生成三个文件夹:
__pycache__builddist
我们只需要关注 dist 就行 。dist 文件夹下面是 christmashat 子文件夹,再进去就可以找到我们的 christmashat.exe 文件了 。由于我们的程序运行有两个依赖文件,分别是我们的圣诞帽图片和我们的人脸识别训练集,所以我们需要将这两个文件放入这个 EXE 文件所在的文件夹下 。
现在双击 christmashat.exe 文件就可以正常运行了 。
总结
本文从一个实际需求出发,向大家讲解了一个头像添加圣诞帽软件的诞生过程 。相对于之前的一些小应用来说,涉及的知识点较多,可能还是有点复杂的 。其中有一些知识点限于篇幅原因没有详细讲解,大家可以自己私下补充 。
(今完)
推荐阅读
- 蚂蚱产卵是什么样子的
- 霍比特人是矮人吗
- 蜈蚣草能净化水质吗
- 高速服务区两边是互通的吗
- 长城在北京的什么方向
- 苏铁的果实可以吃吗
- 天际线是什么意思
- 文件抬头是指
- 首位获得诺贝尔文学奖的亚洲人是
- 镜子背面镀膜层是什么
