****** 在上一节中,我们讲述了如何基于数据库组件进行数据录入,本节我们继续讲解如何通过摄像头和图片上传来进行信息识别并填充,相信学会本节课的内容,将能帮助我们更高效的录入数据。******
1.调用摄像头组件
我们希望点击摄像头按钮时,能弹出一个对话框看到摄像头实时画面并能进行拍照截图,我们可以在下面的文件和资源区内用鼠标右键单击,在弹出菜单中“新建窗体”,这时会弹出界面名称对话框,输入“VideoDlg"作为新界面即可。
编辑
在创建出VideoDlg新界面后,会在文件资源栏出现三个文件:
- VideoDlg.py:界面控件及布局文件
- VideoDlg_cmd.py:界面控件事件函数代码文件。
- VideoDog_sty.py:界面皮肤代码文件。
编辑
双击VideoDlg.py,进入到界面设计器后,从左边的控件工具条拖动一个Canvas画布到Form_1中,再拖动一个按钮到画布右边,修改文字为“拍照”。
将左边控件工具条切换到“组件”,然后拖动一个VideoCapture(摄像头)组件到Form_1上,并从右上边的控件层级树上拖动Canvas_1到下方VideoCapture属性栏的“界面控件”的值栏位中松开,就可以将画布设置为摄像头输出画面的控件了。
编辑
双击“拍照”按钮进入到代码编辑器,首先在Form_1_onLoad函数中用鼠标右键单击,在弹出菜单中找到VideoCapture_1的“开始录像“菜单项,调用启动摄像头函数。
编辑
接着可以继续使用菜单项”将视频保存为图片“为”拍照“按钮函数增加代码,并在结尾使用Fun.DestroyUI函数加上关闭当前界面的函数,这样就可以在点击”拍照“按钮时,将当前视频截图保存为一个图片文件(这里命名为videocapture.png"),然后关闭对话框了。
#Button 'Button_1' 's Command Event :
def Button_1_onCommand(uiName,widgetName,threadings=0):
VideoCapture_1=Fun.GetElement(界面名称=uiName,控件名称='VideoCapture_1')
VideoCapture_1.SaveImageToFile('book.png',callbackFunction = None)
Fun.DestroyUI(界面名称=uiName,销毁参数=0,可选择使用关闭动画='')
pass
CTRL+S保存一下当前文件后,双击”图书数据录入“界面文件回到设计器,并在摄像头按钮上用鼠标右键单击,在弹出菜单中选择”Command“事件,然后在右边的动作按钮中选择”调用其它界面“,这时还会再弹出一个小选项对话框,我们继续点击最后一项”调用自定义界面“,在弹出的对话框中选择刚才创建的VideoDlg.py文件,这样我们就完成了点击摄像头按钮时启动摄像头并拍照的处理。不过我们仍然应该在当前的代码后面加上一句将book.png设置为画布背景图:
Fun.SetCanvasBGImage(界面名称=uiName,控件名称='Canvas_1',图片文件路径='book.png',绘制方式='zoom')
编辑
返回设计视图后,再次为选封面按钮用鼠标右键操作,在Command事件中调用打开文件对话框。
编辑
进入代码编辑器后,修改代码为以下内容,这里要注意的是摄像头截图保存并不是实时保存,它保存后会调用一个回调函数,我们可以在回调函数里关闭对话框。
#Button 'Button_1' 's Command Event :
def Button_1_onCommand(uiName,widgetName,threadings=0):
VideoCapture_1=Fun.GetElement(uiName,'VideoCapture_1')
def callbackFunction():
Fun.DestroyUI(uiName,0,'')
VideoCapture_1.SaveImageToFile('book.png',callbackFunction)
这样界面部分我们就做好了,运行一下可以看到这样的效果,而且当点击摄像头时,可以拍照并将画面保存到本地图片并加载到显示封面的画布上。同样点击加载封面图片按钮也可以将图片文件加载显示到显示封面的画布上。
编辑
2.视觉理解大模型
前面说到,我们希望能通过图像识别来快速实现智能化输入,要想实现这个功能,我们还需要借助于一些视觉理解大模型,比如智谱AI开放平台的GLM-4.5V,
编辑
我尝试将《明朝那些事儿》的封面图上传,识别效果还是很不错的。
编辑
API参考文档中明确是可以先将图片转成base64然后上传。
编辑
只要申请API KEY,参考下方代码,并填充在下方的Authorization :"Bearer <这里填写申请到的API Key>" 中就可以用啦~。
import requests
import base64
import re
url = "https://open.bigmodel.cn/api/paas/v4/chat/completions"
# 读取图片文件并转换为base64
def image_to_base64(image_path):
with open(image_path, "rb") as image_file:
return base64.b64encode(image_file.read()).decode('utf-8')
# 图书封面图片路径
image_path1 = "book.png"
# 将图片转换为base64
image1_base64 = image_to_base64(image_path1)
payload = {
"model": "glm-4.5v", # 注意:根据文档,多模态模型可能是这个
"messages": [
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{image1_base64}"
}
},
{
"type": "text",
"text": "请识别当前图书的书名,作者,出版社信息并使用[书名,作者,出版社]固定格式进行输出,如果识别不出来,对应的字段请输出为空。除此以外不要有其它文字内容。"
}
]
}
]
}
headers = {
"Authorization": "Bearer <token>", # 替换为您的实际token
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
result = response.json()
# 简化版提取函数
def extract_book_info_simple(response_data):
try:
content = response_data['choices'][0]['message']['content']
# 直接提取方括号内的内容
match = re.search(r'[(.*?)]', content)
if match:
book_info = match.group(1)
parts = [part.strip() for part in book_info.split(',')]
return {
'book_name': parts[0],
'author': parts[1],
'publisher': parts[2]
}
except:
pass
return None
# 使用简化版
book_info = extract_book_info_simple(result)
if book_info:
print("图书信息提取成功:")
print(f"书名: {book_info['book_name']}")
print(f"作者: {book_info['author']}")
print(f"出版社: {book_info['publisher']}")
else:
print("图书信息提取失败")
现在能进行视觉理解的大模型非常多了,具体的使用大同小异,就大家根据各自选择的大模型参考文档进行就可以接入了,关键是要明白对AI安排任务的Prompt怎么写。
现在既然已经能通过图像获取到书名、作者、出版社信息了,直接调用Fun.SetText将它们设置到输入框,就不用我再解释了吧~
写在最后:
本次数据案例工具的开发有点难度,但是如果你花点时间去学习和掌握它,你就会更加理解PyMe可视化编程的这一套流程。下节课,我们将尝试开发一个有趣的小游戏,欢迎继续关注100个小案例玩转Python软件开发!