一个简单的摄像头应用程序4

ops/2024/10/21 9:05:57/

我们进一步完善了这个app01.py,我们优化了界面使其更人性化,下面介绍中包含了原有的功能及新增的功能:
创建和管理文件夹:

create_folder 函数用于创建保存照片和视频的文件夹。
get_next_file_number 函数用于获取文件夹中下一个可用的文件编号。
图像处理:

pil_to_cv 函数用于将PIL图像转换为OpenCV图像。
remove_buttons 函数用于去除界面上的按钮。
add_timestamp 函数用于在图像上添加时间戳。
apply_filter 函数用于应用图像滤镜(灰度和模糊)。
鼠标回调:

mouse_callback 函数用于处理鼠标事件,包括按钮点击、区域选择等。
文件操作:

save_photo 函数用于保存照片。
start_recording 和 stop_recording 函数用于开始和停止录像。
switch_camera 函数用于切换摄像头。
open_photo_folder 函数用于打开照片文件夹。
绘制功能:

draw_buttons 函数用于在图像上绘制按钮。
draw_hints 函数用于在图像上绘制提示信息。
主函数:

main 函数是程序的入口点,负责初始化摄像头、设置鼠标回调、读取和处理图像、显示图像等。

python">import cv2
import os
import numpy as np
from PIL import Image, ImageDraw, ImageFont
import datetime
import webbrowser
import logging
import threading# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')# 检查并创建保存照片和视频的文件夹
def create_folder(folder_name):if not os.path.exists(folder_name):os.makedirs(folder_name)return folder_name# 获取文件夹中的最大编号
def get_next_file_number(folder_name, file_extension):files = os.listdir(folder_name)files = [f for f in files if f.endswith(file_extension)]if files:numbers = [int(f.split('.')[0]) for f in files]return max(numbers) + 1else:return 1# 将PIL图像转换为OpenCV图像
def pil_to_cv(image):return cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR)# 鼠标回调函数
def mouse_callback(event, x, y, flags, param):global next_photo_number, next_video_number, running, recording, out, frame, scale_factor, cam_index, roi, button_hintsif event == cv2.EVENT_LBUTTONDOWN:if 10 <= x <= 100 and 10 <= y <= 50:  # 关闭按钮区域running = Falseelif 10 <= x <= 100 and 70 <= y <= 110:  # 拍照按钮区域threading.Thread(target=save_photo, args=(frame, next_photo_number)).start()next_photo_number += 1elif 10 <= x <= 100 and 130 <= y <= 170:  # 开始/停止录像按钮区域if not recording:start_recording()else:stop_recording()elif 10 <= x <= 100 and 190 <= y <= 230:  # 放大按钮区域scale_factor = min(3.0, scale_factor * 2)elif 10 <= x <= 100 and 250 <= y <= 290:  # 缩小按钮区域scale_factor = max(1.0, scale_factor / 2)elif 10 <= x <= 100 and 310 <= y <= 350:  # 切换摄像头按钮区域switch_camera()elif 10 <= x <= 100 and 370 <= y <= 410:  # 查看照片按钮区域open_photo_folder()elif event == cv2.EVENT_RBUTTONDOWN:roi[0], roi[1] = x, yelif event == cv2.EVENT_RBUTTONUP:roi[2], roi[3] = x - roi[

http://www.ppmy.cn/ops/121193.html

相关文章

8c语言基础文件

关于文件你必须了解的一些基本概念 什么是文件&#xff1f; 文件是计算机文件&#xff0c;属于文件的一种&#xff0c;与普通文件的载体不同&#xff0c;计算机文件是以计算机硬盘为载体存储在计算机上的信息集合。 在程序设计中&#xff0c;我们一般关注的文件有两类&#x…

从 TCP Reno 经 BIC 到 CUBIC

重读 TCP拥塞控制算法-从BIC到CUBIC 以及 cubic 的 tcp friendliness 与拐点控制 这两篇文章&#xff0c;感觉还是啰嗦了&#xff0c;今日重新一气呵成这个话题。 reno 线性逼近管道容量 Wmax&#xff0c;相当于一次查询(capacity-seeking)&#xff0c;但长肥管道从 0.5*Wmax …

MQTTnet.Extensions.ManagedClient客户端连接

一、MQTT客户端 代码如下&#xff08;示例&#xff09;&#xff1a; using MQTTnet; using MQTTnet.Client; using MQTTnet.Extensions.ManagedClient; using MQTTnet.Protocol; using MQTTnet.Server; using System; using System.Collections.Generic; using System.Linq…

如何将git 远程仓库update新建分支同步test到个人own仓库

若要将一个远程Git仓库&#xff08;比如GitHub, GitLab等&#xff09;中新建的分支&#xff08;比如叫new-branch&#xff09;同步到你个人的仓库&#xff08;假设是GitHub上你的个人仓库&#xff09;&#xff0c;并且你希望这个分支在你个人仓库中命名为test&#xff0c;你可以…

单元测试进阶-Mock使用和插桩

目录 一、基本概念 1、Mock 2、插桩&#xff08;Sutbbing&#xff09; 二、参考文章 一、基本概念 1、Mock Mock的作用就是不直接new对象&#xff0c;而是使用Mock方法或者注解Mock一个对象。 这个对象他不是new创建的对象&#xff0c;Mock对该对象的一些成员变量和方法…

云电脑、指纹浏览器,虚拟机这三者的区别

云电脑、指纹浏览器、虚拟机是三种常见的技术工具&#xff0c;它们各自有不同的应用场景和功能。以下是它们的区别和特点&#xff1a; 1. 云电脑 定义&#xff1a;云电脑是一种基于云计算技术的远程虚拟桌面服务。用户通过互联网远程访问并使用强大的云端服务器资源&#xff0…

maven工程的血案

最近在学习RPC框架&#xff0c;跟着视频边学边敲&#xff0c;结果发现代码跑起来爆了很多错误&#xff0c;最后通过推倒重新写了代码&#xff0c;并且按照maven工程要求代码规范就解决了bug。 maven工程的groupId和artifactId一定要和包名对应

浅谈汽车智能座舱如何实现多通道音频

一、引言 随着汽车智能座舱的功能迭代发展&#xff0c;传统的 4 通道、6 通道、8 通道等音响系统难以在满足驾驶场景的需求&#xff0c;未来对于智能座舱音频质量和通道数会越来越高。接下来本文将浅析目前智能座舱如何实现音频功放&#xff0c;以及如何实现多路音频功放方案。…