基于Python和Tkinter的双目相机驱动界面

文章目录

    • 前言
    • 准备工作
    • 代码分析
      • 初始化
      • 创建按钮
      • 创建图像显示区域
      • 创建信息标签
      • 启动摄像头捕捉
      • 主函数
      • 结论
      • 效果展示


前言

  本文将介绍如何使用Python和Tkinter库来创建一个简单的摄像头应用程序。这个应用程序可以打开摄像头,显示摄像头捕捉的图像,并允许用户拍摄快照。

准备工作

需要安装以下Python库:
tkinter:用于创建GUI界面。
cv2:OpenCV库,用于处理图像和捕捉摄像头帧。
PIL:Python Imaging Library,用于图像处理。
numpy:用于数值计算。

代码分析

  程序由一个MyWindow类组成,该类包含了应用程序的主要逻辑和GUI元素。

初始化

class MyWindow:def __init__(self, root):self.root = rootroot.title("Camera")root.geometry("960x640")# ...

  创建了一个MyWindow类,该类在初始化时创建一个Tkinter窗口,设置窗口标题和大小。

创建按钮

 def create_buttons(self):# ...

  创建了两个按钮,一个用于启动摄像头捕捉,另一个用于拍摄快照。

创建图像显示区域

def create_image_displays(self):# ...

  创建了两个Canvas,用于显示摄像头捕捉到的左半边和右半边的图像。

创建信息标签

def create_info_label(self):# ...

  创建了一个Label,用于显示交互信息,例如拍摄的快照文件名。

启动摄像头捕捉

def start_capture(self):while True:ret, frame = self.camera.read()# ...

  这个方法启动了摄像头捕捉循环,不断捕捉摄像头帧并在左侧和右侧Canvas上显示它们。
拍摄快照

def take_snapshot(self):# ...

  这个方法允许用户拍摄快照,将左半边和右半边的图像保存为PNG文件,并在信息标签上显示已保存的文件名。

主函数

def main():root = tk.Tk()my_window = MyWindow(root)root.mainloop()if __name__ == "__main__":main()

在主函数中,创建了Tkinter窗口并实例化MyWindow类,然后启动了Tkinter的主循环。

结论

通过上述代码和解释,可以创建一个简单的摄像头应用程序,用于捕捉图像并保存快照。你可以根据需要对应用程序进行扩展,添加更多功能,如图像处理等。

效果展示

运行
在这里插入图片描述
启动
在这里插入图片描述
拍摄
在这里插入图片描述
在这里插入图片描述

完整的程序代码如下:

import tkinter as tk
from tkinter import Canvas, Label, Button
import cv2
import numpy as np
from PIL import Image, ImageTk
import os
from PIL import Imageclass MyWindow:def __init__(self, root):self.root = rootroot.title("Camera")root.geometry("960x640")self.create_buttons()self.create_image_displays()self.create_info_label()self.camera = cv2.VideoCapture(0)  # 打开相机self.left_photo = tk.PhotoImage()self.right_photo = tk.PhotoImage()self.snapshot_count = 0  # 用于递增文件名编号def create_buttons(self):# 创建一个框架,用于水平居中排列按钮button_frame = tk.Frame(self.root)button_frame.pack(side="top")# 创建拍摄按钮,绑定事件处理函数self.capture_button = tk.Button(button_frame, text="启动", width=10, height=2, command=self.start_capture)self.capture_button.pack(side="left", padx=10, pady=20)# 创建拍摄按钮self.start_button = tk.Button(button_frame, text="拍摄", width=10, height=2, command=self.take_snapshot)self.start_button.pack(side="left", padx=10)def create_image_displays(self):# 创建一个框架,用于容纳两个Canvas并在水平方向上居中排列image_frame = tk.Frame(self.root)image_frame.pack(side="top", pady=20)  # 添加垂直间距以使其垂直居中# 创建左侧Canvas并设置背景颜色为白色self.left_canvas = Canvas(image_frame, width=320, height=240, bg="white")self.left_canvas.pack(side="left", padx=20)# 创建右侧Canvas并设置背景颜色为白色self.right_canvas = Canvas(image_frame, width=320, height=240, bg="white")self.right_canvas.pack(side="left", padx=10)def create_info_label(self):# 创建一个Label用于显示交互信息,设置背景颜色为白色,放置在底部并铺满整个宽度self.info_label = Label(self.root, text="This is 信息", font=("Arial", 12), bg="white", height=10)self.info_label.pack(side="bottom", fill="x")def start_capture(self):while True:ret, frame = self.camera.read()if not ret:print("无法读取帧")break# 将画面分为左半边和右半边height, width, _ = frame.shapeleft_half = frame[:, :width // 2]right_half = frame[:, width // 2:]# 使用PIL库将图像数据从OpenCV格式转换为Tkinter PhotoImage格式left_image = Image.fromarray(cv2.cvtColor(left_half, cv2.COLOR_BGR2RGB))right_image = Image.fromarray(cv2.cvtColor(right_half, cv2.COLOR_BGR2RGB))self.left_photo = ImageTk.PhotoImage(image=left_image)self.right_photo = ImageTk.PhotoImage(image=right_image)# 调整左半边和右半边的图像大小为Canvas的大小(320x240)left_resized = left_image.resize((320, 240), Image.ANTIALIAS)right_resized = right_image.resize((320, 240), Image.ANTIALIAS)self.left_photo_resized = ImageTk.PhotoImage(image=left_resized)self.right_photo_resized = ImageTk.PhotoImage(image=right_resized)# 在Canvas上显示调整大小后的左半边和右半边图像self.left_canvas.create_image(0, 0, anchor="nw", image=self.left_photo_resized)self.right_canvas.create_image(0, 0, anchor="nw", image=self.right_photo_resized)self.root.update()  # 更新Tkinter窗口def take_snapshot(self):# 获取当前的左半边和右半边图像left_image = Image.fromarray(cv2.cvtColor(self.camera.read()[1], cv2.COLOR_BGR2RGB))right_image = Image.fromarray(cv2.cvtColor(self.camera.read()[1], cv2.COLOR_BGR2RGB))# 递增文件名编号self.snapshot_count += 1# 保存左半边和右半边图像为PNG文件left_filename = f"left{self.snapshot_count}.png"right_filename = f"right{self.snapshot_count}.png"left_image.save(left_filename, "png")right_image.save(right_filename, "png")# 更新信息标签self.info_label.config(text=f"Left: {left_filename}, Right: {right_filename}均已保存!!")def main():root = tk.Tk()my_window = MyWindow(root)root.mainloop()if __name__ == "__main__":main()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/152046.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DruidDataSource导致OOM问题处理

DruidDataSource导致OOM问题处理 起因分析日志分析Dump文件问题分析处理 起因 一个平凡的工作日,我像往常一样完成产品提出的需求的业务代码,突然收到了监控平台发出的告警信息。本以为又是一些业务上的 bug 导致的报错,一看报错发现日志写着…

sed -i 使用变量进行替换

一、替换文本的命令 1、命令: sed -i s/old/new/g xxx.log 例子:将文件1.txt中的字符串 "cores":"" 替换成字符串 "cores":"1" 命令:sed -i s/"cores":""/"…

Unity实现设计模式——模板方法模式

Unity实现设计模式——模板方法模式 模板模式(Template Pattern), 指在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。 简单说, 模板方法模式定义一个操作中的算法的骨架&…

ESP32设备驱动-I2C-LCD1602显示屏驱动

I2C-LCD1602显示屏驱动 1、LCD1602介绍 LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。 通过前面的实例我们知道,并口方式…

Godot 脚本外置参数设置

文章目录 添加脚本设置参数bulid 一下 Godot Engine 4.2 简体中文文档 C# exports 添加脚本 设置参数 Godot 添加脚本后,设置参数。两种形式都可以 [Export]public int Speed { get; set; } 10;[Export]public string Name ;bulid 一下 私有变量也可以

基于Java的个性化旅游攻略系统设计与实现(源码+lw+ppt+部署文档+视频讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

公园视频监控系统如何改造?人工智能又能提供哪些帮助?

近日合肥市骆岗公园宣布正式开园,作为目前世界最大的城市公园,占地12.7万平方公里,如此壮观宏伟的建设,也吸引到了不少市民进行参观打卡。不管大型小型,城市里的公园都是随处可见的,那么,公园安…

模型训练环境相关(CUDA、PyTorch)

模型训练环境相关(CUDA、PyTorch) 1. 查看当前 GPU 所能支持的最高版本的 CUDA2. 如何判断是否安装了 CUDA3. 安装 PyTorch3.1 创建虚拟环境3.2 激活并进入虚拟环境3.3 安装 PyTorch 1. 查看当前 GPU 所能支持的最高版本的 CUDA 打开 NVIDIA 控制面板&a…

设计模式再探——模板方法模式

目录 一、背景介绍二、思路&方案三、过程1.模板方法模式简介2.模板方法模式的类图3.模板方法模式代码4.模板方法模式中的父类为抽象类,为什么不是接口?5.模板方法模式中方法级别的单一职责 四、总结五、升华 一、背景介绍 最近公司在做颗粒业务的时…

2023年中国金属涂胶板行业供需分析:销量同比增长2.8%[图]

金属涂胶板是一种将金属板材表面进行涂覆处理的产品。它通常由金属基材(如钢板、铝板)和胶粘剂组成,胶粘剂可以是有机胶粘剂、聚合物胶粘剂或其他特殊胶粘剂。 金属涂胶板行业分类 资料来源:共研产业咨询(共研网&…

【C语言】Linux平台下解析pcap文件

开发环境是readhat、ubuntu、kali 在wireshark上抓包需要使用 Wireshark/tcpdump/ 且 文件后缀名为.pcap 方式保存 效果如下&#xff1a; 引入俩文件如下。 my_pcap.h #pragma once #include <netinet/in.h>#define PCAP_MAGIC 0xa1b2c3d4typedef struct pcap_file_he…

公众号突破注册操作流程

一般可以注册多少个公众号&#xff1f;众所周知&#xff0c;在2013年前后&#xff0c;公众号申请是不限制数量的&#xff0c;后来企业开始限制申请50个&#xff0c;直到2018年的11月tx又发布&#xff0c;其中个人主体可申请公众号由2个调整为1个&#xff0c;企业主体由50个调整…

全场景流量验证系统 | 京东物流技术团队

本文介绍了一种基于线上流量实现对重构系统进行功能和性能验证的实践方案。针对线上流量如何拦截、如何录制、如何存储、如何回放以及如何发压均作了详细说明&#xff0c;为具有类似需求的读者提供了一种可供参考的思路。 1 业务背景 随着百川项目的启动&#xff0c;中台需要…

机器人中的数值优化(二十一)—— 伴随灵敏度分析、线性方程组求解器的分类和特点、优化软件

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考&#xff0c;主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等&#xff0c;本系列文章篇数较多&#xff0c;不定期更新&#xff0c;上半部分介绍无约束优化&#xff0c;…

漏刻有时数据可视化Echarts组件开发(43)水球图svg温度计动画

SVG是一种用XML定义的语言&#xff0c;用来描述二维矢量及矢量/栅格图形。具体来说&#xff0c;SVG图形是可伸缩的矢量图形&#xff0c;其图像质量不会因放大或改变尺寸而损失。 在SVG中&#xff0c;可以创建和修改图像、对图像进行搜索和索引、对其进行脚本化或压缩。此外&am…

vue3使用element plus的时候组件显示的是英文

问题截图 这是因为国际化导致的 解决代码 import zhCn from "element-plus/es/locale/lang/zh-cn"; 或者 import zhCn from "element-plus/lib/locale/lang/zh-cn";const localezhCn<el-config-provider :locale"locale"><el-date-pic…

Koa学习4:密码加密、验证登录、颁发token、用户认证

请求体 这里遇到了个问题&#xff0c;ctx.request.body 的值是一个字符串。明明已经使用了koa-body中间件 查了一下原因是&#xff1a; ctx.request.body的值可能是一个对象或一个字符串&#xff0c;取决于请求的Content-Type和请求体的格式。 当使用koa-body中间件时&#x…

微信小程序 movable-area 区域拖动动态组件演示

movable-area 组件在小程序中的作用是用于创建一个可移动的区域&#xff0c;可以在该区域内拖动视图或内容。这个组件常用于实现可拖动的容器或可滑动的列表等交互效果。 使用 movable-area 组件可以对其内部的 movable-view 组件进行拖动操作&#xff0c;可以通过设置不同的属…

mp4视频太大怎么压缩变小?

mp4视频太大怎么压缩变小&#xff1f;确实&#xff0c;很多培训和教学都转向了线上模式&#xff0c;这使得我们需要下载或分享大量的在线教学视频。然而&#xff0c;由于MP4视频文件通常较大&#xff0c;可能会遇到无法打开或发送的问题。为了解决这个问题&#xff0c;我们可以…

selenium-webdriver-Chrome新驱动地址(Chrome115及以上版本)

Chrome115、Chrome116、Chrome117&#xff0c;在旧的链接并没有 新地址&#xff1a;https://googlechromelabs.github.io/chrome-for-testing/ 参考学习链接&#xff08;我也是根据这个老师的链接学到的&#xff09;&#xff1a;https://www.cnblogs.com/wuxianfeng023/p/1765…