当前位置: 首页 > news >正文

什么样建网站网页分析从哪些方面

什么样建网站,网页分析从哪些方面,微慕wordpress插件,室内设计师做单网站前言#xff1a; Hello大家好#xff0c;我是Dream。 今天来学习一下如何使用OpenCV实现手势音量控制#xff0c;欢迎大家一起前来探讨学习~ 一、需要的库及功能介绍 本次实验需要使用OpenCV和mediapipe库进行手势识别#xff0c;并利用手势距离控制电脑音量。 导入库 Hello大家好我是Dream。 今天来学习一下如何使用OpenCV实现手势音量控制欢迎大家一起前来探讨学习~ 一、需要的库及功能介绍 本次实验需要使用OpenCV和mediapipe库进行手势识别并利用手势距离控制电脑音量。 导入库 cv2OpenCV库用于读取摄像头视频流和图像处理。mediapipemediapipe库用于手部关键点检测和手势识别。ctypes和comtypes用于与操作系统的音频接口进行交互。pycawpycaw库用于控制电脑音量。 功能 初始化mediapipe和音量控制模块获取音量范围。打开摄像头读取视频流。对每一帧图像进行处理 转换图像为RGB格式。使用mediapipe检测手部关键点。如果检测到手部关键点 在图像中标注手指关键点和手势连线。解析手指关键点坐标。根据拇指和食指指尖的坐标计算手势距离。将手势距离转换为音量大小并控制电脑音量。 显示处理后的图像。 循环执行前述步骤直到手动停止程序或关闭摄像头。 注意事项: 在运行代码之前需要安装相关库opencv、mediapipe、pycaw。需要连接音频设备并使其可访问。检测到多个手部时只处理第一个检测到的手部。检测到手指关键点时将索引指为0的关键点作为拇指的指尖索引指为1的关键点作为食指的指尖。 cv2.VideoCapture()函数参数问题 这并没有错。但在树莓派上调用时需要更改参数改为 cap cv2.VideoCapture(1)调用电脑摄像头时 电脑在用cv2.VideoCapture(0)时程序结束后会有报错 [ WARN:0] SourceReaderCB::~SourceReaderCB terminating async callback 需要改为 cv2.VideoCapture(0,cv2.CAP_DSHOW)二、导入所需要的模块 # 导入OpenCV import cv2 # 导入mediapipe import mediapipe as mp # 导入电脑音量控制模块 from ctypes import cast, POINTER from comtypes import CLSCTX_ALL from pycaw.pycaw import AudioUtilities, IAudioEndpointVolume# 导入其他依赖包 import time import math import numpy as np三、初始化 HandControlVolume 类 class HandControlVolume:def __init__(self):初始化 HandControlVolume 类的实例初始化 mediapipe 对象用于手部关键点检测和手势识别。获取电脑音量接口并获取音量范围。# 初始化 medialpipeself.mp_drawing mp.solutions.drawing_utilsself.mp_drawing_styles mp.solutions.drawing_stylesself.mp_hands mp.solutions.hands# 获取电脑音量范围devices AudioUtilities.GetSpeakers()interface devices.Activate(IAudioEndpointVolume._iid_, CLSCTX_ALL, None)self.volume cast(interface, POINTER(IAudioEndpointVolume))self.volume.SetMute(0, None)self.volume_range self.volume.GetVolumeRange()初始化 mediapipe 对象用于手部关键点检测和手势识别。获取电脑音量接口并获取音量范围。 四、主函数 1.计算刷新率 初始化刷新率的计算记录当前时间作为初始时间。 使用OpenCV打开视频流此处读取摄像头设备默认使用设备ID为0。 设置视频流的分辨率为指定的resize_w和resize_h大小并将图像resize为该尺寸。 在使用hands对象之前使用with语句创建一个上下文环境设置手部检测和追踪的相关参数包括最小检测置信度、最小追踪置信度和最大手的数量。 进入循环判断视频流是否打开。使用cap.read()函数从视频流中读取一帧图像返回的success表示是否读取成功image则是读取到的图像。 对读取到的图像进行resize将其调整为指定的大小。如果读取失败则打印提示信息并继续下一次循环。 # 主函数def recognize(self):# 计算刷新率fpsTime time.time()# OpenCV读取视频流cap cv2.VideoCapture(0)# 视频分辨率resize_w 640resize_h 480# 画面显示初始化参数rect_height 0rect_percent_text 0with self.mp_hands.Hands(min_detection_confidence0.7,min_tracking_confidence0.5,max_num_hands2) as hands:while cap.isOpened():success, image cap.read()image cv2.resize(image, (resize_w, resize_h))if not success:print(空帧.)continue2.提高性能 将图像的可写标志image.flags.writeable设置为False以便进行内存优化。 将图像从BGR格式转换为RGB格式这是因为MediaPipe模型处理的输入要求为RGB格式。 对图像进行水平翻转即镜像操作以使图像更符合常见的镜像显示。 使用MediaPipe模型对图像进行处理得到结果。 将图像的可写标志image.flags.writeable设置为True以重新启用对图像的写入操作。 将图像从RGB格式转换回BGR格式以便后续的显示和处理。 这些优化操作旨在提高程序的性能和效率。其中将图像的可写标志设置为False可以减少不必要的内存拷贝转换图像的格式和镜像操作则是为了符合MediaPipe模型的输入要求和更好地进行手势识别。最后将图像转换回BGR格式是为了与OpenCV的显示函数兼容。 # 提高性能image.flags.writeable False# 转为RGBimage cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# 镜像image cv2.flip(image, 1)# mediapipe模型处理results hands.process(image)image.flags.writeable Trueimage cv2.cvtColor(image, cv2.COLOR_RGB2BGR)3.判断是否有手掌 判断results.multi_hand_landmarks是否存在即是否检测到手掌。如果存在则继续执行下面的代码。 遍历results.multi_hand_landmarks中的每个hand_landmarks即遍历每个检测到的手掌。 使用self.mp_drawing.draw_landmarks函数将检测到的手掌标注在图像上包括手指的关键点和手指之间的连接线。 # 判断是否有手掌if results.multi_hand_landmarks:# 遍历每个手掌for hand_landmarks in results.multi_hand_landmarks:# 在画面标注手指self.mp_drawing.draw_landmarks(image,hand_landmarks,self.mp_hands.HAND_CONNECTIONS,self.mp_drawing_styles.get_default_hand_landmarks_style(),self.mp_drawing_styles.get_default_hand_connections_style())4.解析手指存入各个手指坐标 首先解析手指的坐标并存入landmark_list列表中。然后根据手指的坐标计算出大拇指和食指的指尖坐标以及两者的中间点坐标。接下来绘制了大拇指、食指和两者之间的连线并使用勾股定理计算了两个指尖之间的长度。 创建一个空的landmark_list列表用于存储手指坐标。 遍历手部关键点的每个元素将每个关键点的id、x、y和z坐标存储在一个列表中然后将该列表添加到landmark_list中。 判断landmark_list是否不为空如果不为空继续执行下面的代码。 从landmark_list中获取大拇指指尖坐标的列表项然后计算出在图像上的像素坐标。 从landmark_list中获取食指指尖坐标的列表项然后计算出在图像上的像素坐标。 计算大拇指指尖和食指指尖的中间点坐标。 绘制大拇指和食指的指尖点以及中间点。 绘制大拇指和食指之间的连线。 使用勾股定理计算大拇指指尖和食指指尖之间的长度保存在line_len中。 # 解析手指存入各个手指坐标landmark_list []for landmark_id, finger_axis in enumerate(hand_landmarks.landmark):landmark_list.append([landmark_id, finger_axis.x, finger_axis.y,finger_axis.z])if landmark_list:# 获取大拇指指尖坐标thumb_finger_tip landmark_list[4]thumb_finger_tip_x math.ceil(thumb_finger_tip[1] * resize_w)thumb_finger_tip_y math.ceil(thumb_finger_tip[2] * resize_h)# 获取食指指尖坐标index_finger_tip landmark_list[8]index_finger_tip_x math.ceil(index_finger_tip[1] * resize_w)index_finger_tip_y math.ceil(index_finger_tip[2] * resize_h)# 中间点finger_middle_point (thumb_finger_tip_x index_finger_tip_x) // 2, (thumb_finger_tip_y index_finger_tip_y) // 2# print(thumb_finger_tip_x)thumb_finger_point (thumb_finger_tip_x, thumb_finger_tip_y)index_finger_point (index_finger_tip_x, index_finger_tip_y)# 画指尖2点image cv2.circle(image, thumb_finger_point, 10, (255, 0, 255), -1)image cv2.circle(image, index_finger_point, 10, (255, 0, 255), -1)image cv2.circle(image, finger_middle_point, 10, (255, 0, 255), -1)# 画2点连线image cv2.line(image, thumb_finger_point, index_finger_point, (255, 0, 255), 5)# 勾股定理计算长度line_len math.hypot((index_finger_tip_x - thumb_finger_tip_x),(index_finger_tip_y - thumb_finger_tip_y)) 5.获取电脑最大最小音量 实现获取电脑的最大和最小音量并将指尖的长度映射到音量范围和矩形显示上然后将映射后的音量值设置为电脑的音量。具体过程如下 self.volume_range[0]和self.volume_range[1]分别获取电脑的最小音量和最大音量。 np.interp函数将指尖的长度line_len映射到从50到300的范围再映射到最小音量和最大音量的范围得到音量值vol。 np.interp函数将指尖的长度line_len映射到从50到300的范围再映射到从0到200的范围得到矩形的高度rect_height。 np.interp函数将指尖的长度line_len映射到从50到300的范围再映射到从0到100的范围得到矩形百分比显示的数值rect_percent_text。 self.volume.SetMasterVolumeLevel方法将音量值vol设置为电脑的音量。 # 获取电脑最大最小音量min_volume self.volume_range[0]max_volume self.volume_range[1]# 将指尖长度映射到音量上vol np.interp(line_len, [50, 300], [min_volume, max_volume])# 将指尖长度映射到矩形显示上rect_height np.interp(line_len, [50, 300], [0, 200])rect_percent_text np.interp(line_len, [50, 300], [0, 100])# 设置电脑音量self.volume.SetMasterVolumeLevel(vol, None)6.显示矩形 cv2.putText函数来在图像上显示矩形框的百分比值 cv2.rectangle函数来绘制矩形框并填充颜色 cv2.putText函数来在图像上显示当前帧的刷新率FPS cv2.imshow函数来显示处理后的图像 cv2.waitKey函数等待按键输入当按下ESC键或关闭窗口时退出程序 HandControlVolume类的recognize方法调用了手势识别的功能。 # 显示矩形cv2.putText(image, str(math.ceil(rect_percent_text)) %, (10, 350),cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 0), 3)image cv2.rectangle(image, (30, 100), (70, 300), (255, 0, 0), 3)image cv2.rectangle(image, (30, math.ceil(300 - rect_height)), (70, 300), (255, 0, 0), -1)# 显示刷新率FPScTime time.time()fps_text 1 / (cTime - fpsTime)fpsTime cTimecv2.putText(image, FPS: str(int(fps_text)), (10, 70),cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 0), 3)# 显示画面cv2.imshow(MediaPipe Hands, image)if cv2.waitKey(5) 0xFF 27 or cv2.getWindowProperty(MediaPipe Hands, cv2.WND_PROP_VISIBLE) 1:breakcap.release()# 开始程序 control HandControlVolume() control.recognize() 五、实战演示 通过演示我们可以发现食指与大拇指之间在屏幕中的的距离越远那么我们的音量会越大反之越小实现了通过手势对音量的控制。 六、源码分享 import cv2 import mediapipe as mp from ctypes import cast, POINTER from comtypes import CLSCTX_ALL from pycaw.pycaw import AudioUtilities, IAudioEndpointVolume import time import math import numpy as npclass HandControlVolume:def __init__(self):# 初始化medialpipeself.mp_drawing mp.solutions.drawing_utilsself.mp_drawing_styles mp.solutions.drawing_stylesself.mp_hands mp.solutions.hands# 获取电脑音量范围devices AudioUtilities.GetSpeakers()interface devices.Activate(IAudioEndpointVolume._iid_, CLSCTX_ALL, None)self.volume cast(interface, POINTER(IAudioEndpointVolume))self.volume.SetMute(0, None)self.volume_range self.volume.GetVolumeRange()# 主函数def recognize(self):# 计算刷新率fpsTime time.time()# OpenCV读取视频流cap cv2.VideoCapture(0)# 视频分辨率resize_w 640resize_h 480# 画面显示初始化参数rect_height 0rect_percent_text 0with self.mp_hands.Hands(min_detection_confidence0.7,min_tracking_confidence0.5,max_num_hands2) as hands:while cap.isOpened():success, image cap.read()image cv2.resize(image, (resize_w, resize_h))if not success:print(空帧.)continue# 提高性能image.flags.writeable False# 转为RGBimage cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# 镜像image cv2.flip(image, 1)# mediapipe模型处理results hands.process(image)image.flags.writeable Trueimage cv2.cvtColor(image, cv2.COLOR_RGB2BGR)# 判断是否有手掌if results.multi_hand_landmarks:# 遍历每个手掌for hand_landmarks in results.multi_hand_landmarks:# 在画面标注手指self.mp_drawing.draw_landmarks(image,hand_landmarks,self.mp_hands.HAND_CONNECTIONS,self.mp_drawing_styles.get_default_hand_landmarks_style(),self.mp_drawing_styles.get_default_hand_connections_style())# 解析手指存入各个手指坐标landmark_list []for landmark_id, finger_axis in enumerate(hand_landmarks.landmark):landmark_list.append([landmark_id, finger_axis.x, finger_axis.y,finger_axis.z])if landmark_list:# 获取大拇指指尖坐标thumb_finger_tip landmark_list[4]thumb_finger_tip_x math.ceil(thumb_finger_tip[1] * resize_w)thumb_finger_tip_y math.ceil(thumb_finger_tip[2] * resize_h)# 获取食指指尖坐标index_finger_tip landmark_list[8]index_finger_tip_x math.ceil(index_finger_tip[1] * resize_w)index_finger_tip_y math.ceil(index_finger_tip[2] * resize_h)# 中间点finger_middle_point (thumb_finger_tip_x index_finger_tip_x) // 2, (thumb_finger_tip_y index_finger_tip_y) // 2# print(thumb_finger_tip_x)thumb_finger_point (thumb_finger_tip_x, thumb_finger_tip_y)index_finger_point (index_finger_tip_x, index_finger_tip_y)# 画指尖2点image cv2.circle(image, thumb_finger_point, 10, (255, 0, 255), -1)image cv2.circle(image, index_finger_point, 10, (255, 0, 255), -1)image cv2.circle(image, finger_middle_point, 10, (255, 0, 255), -1)# 画2点连线image cv2.line(image, thumb_finger_point, index_finger_point, (255, 0, 255), 5)# 勾股定理计算长度line_len math.hypot((index_finger_tip_x - thumb_finger_tip_x),(index_finger_tip_y - thumb_finger_tip_y))# 获取电脑最大最小音量min_volume self.volume_range[0]max_volume self.volume_range[1]# 将指尖长度映射到音量上vol np.interp(line_len, [50, 300], [min_volume, max_volume])# 将指尖长度映射到矩形显示上rect_height np.interp(line_len, [50, 300], [0, 200])rect_percent_text np.interp(line_len, [50, 300], [0, 100])# 设置电脑音量self.volume.SetMasterVolumeLevel(vol, None)# 显示矩形cv2.putText(image, str(math.ceil(rect_percent_text)) %, (10, 350),cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 0), 3)image cv2.rectangle(image, (30, 100), (70, 300), (255, 0, 0), 3)image cv2.rectangle(image, (30, math.ceil(300 - rect_height)), (70, 300), (255, 0, 0), -1)# 显示刷新率FPScTime time.time()fps_text 1 / (cTime - fpsTime)fpsTime cTimecv2.putText(image, FPS: str(int(fps_text)), (10, 70),cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 0), 3)# 显示画面cv2.imshow(xyp, image)if cv2.waitKey(5) 0xFF 27 or cv2.getWindowProperty(MediaPipe Hands, cv2.WND_PROP_VISIBLE) 1:breakcap.release() control HandControlVolume() control.recognize()
http://wiki.neutronadmin.com/news/209192/

相关文章:

  • wap网站 微信登录平面广告设计趋势
  • 授权网站系统互联网公司经营范围
  • seo搜索优化网站推广排名巨野城乡住房建设局网站
  • 文字头像在线制作免费生成seo网络营销的技术
  • 禅城南庄网站制作免费提升学历
  • 杭州网站建设费用多少钱免费的个人简历模板excel
  • 网站正在建设中 英文郑州专业做网站企业
  • 编程就是做网站吗网页升级访问永久
  • 建立商城网站100种创意活动策划
  • 建平县营商环境建设局网站静态网站开发
  • 东莞专业做淘宝网站建设设计素材网站排行
  • 做百度推广需要网站吗岱山县网站建设
  • 校园网的网站建设内容建设校园网站的必要性
  • 网站镜像代理怎么做安康市代驾公司
  • 建筑工程论坛网赣州seo培训
  • 企业网站带手机源码wordpress站群+优化
  • 关系的网站营销软文范文
  • 重庆网上房地产网站长工具seo诊断
  • 网站套利怎么做网络广告营销的典型案例
  • 高校网站建设规范免费科技软件
  • 动态背景设置网站wap浏览器
  • 无锡哪家公司做网站网站搭建手机
  • 在线手机网站建设dw网页制作教程视频简单第三期
  • 白城网站开发网站设计网站建站
  • 江西省建设部网站无锡新区企业网站推广
  • 工程建设标准下载网站建应用网站
  • 专门做音乐的网站wordpress怎么装模板
  • 网站设计)七牛云存储wordpress插件
  • 重庆有专业做网站的吗用什么服务器做盗版小说网站吗
  • 山东省建设厅网站地址上海app软件开发