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

网站建设模板元素是什么片多多影视剧免费

网站建设模板元素是什么,片多多影视剧免费,西部数码网站核验单下载,广告制作属于什么行业前言#xff1a; Hello大家好#xff0c;我是Dream。 今天来学习一下如何使用OpenCV实现手势虚拟拖拽#xff0c;欢迎大家一起前来探讨学习~ 一、主要步骤及库的功能介绍 1.主要步骤 要实现本次实验#xff0c;主要步骤如下#xff1a; 导入OpenCV库。通过OpenCV读取摄… 前言 Hello大家好我是Dream。 今天来学习一下如何使用OpenCV实现手势虚拟拖拽欢迎大家一起前来探讨学习~ 一、主要步骤及库的功能介绍 1.主要步骤 要实现本次实验主要步骤如下 导入OpenCV库。通过OpenCV读取摄像头的视频流。使用肤色检测算法如色彩空间转换和阈值分割来识别手部区域。对手部区域进行轮廓检测找到手的轮廓。根据手的轮廓获取手指关键点的像素坐标。对于拖拽手势可以关注食指和中指的位置。计算食指和中指指尖之间的距离并判断是否满足条件触发拖拽动作。如果满足条件可以使用勾股定理计算距离并将矩形区域变色以示触发拖拽。根据手指的位置更新矩形的坐标使矩形跟随手指运动。当手指放开时停止矩形的移动。 2.需要的库介绍 导入的库在实现手势虚拟拖拽的代码中起着重要的作用下面是对每个库的简要介绍 OpenCV (cv2): OpenCV是一个开源的计算机视觉库提供了丰富的图像和视频处理功能使用OpenCV来读取摄像头视频流、进行图像处理和计算。 mediapipe (mp): mediapipe提供一系列预训练的机器学习模型和工具用于实现计算机视觉和机器学习任务。我们使用mediapipe来进行手部关键点检测和姿势估计。 time: 我们使用time库来计时和进行时间相关的操作。 math: 在本次实验我们使用math库来计算距离和角度。 二、导入所需要的模块 # 导入OpenCV import cv2 # 导入mediapipe import mediapipe as mp# 导入其他依赖包 import time import math三、方块管理类 SquareManager是一个方块管理器用于创建、显示、更新和处理方块的相关操作。 1.初始化方块管理器 初始化方块管理器传入方块的长度rect_width作为参数并初始化方块列表、距离、激活状态和激活的方块ID等属性。 class SquareManager:def __init__(self, rect_width):# 方框长度self.rect_width rect_width# 方块列表self.square_count 0self.rect_left_x_list []self.rect_left_y_list []self.alpha_list []# 中指与矩形左上角点的距离self.L1 0self.L2 0# 激活移动模式self.drag_active False# 激活的方块IDself.active_index -12.创建一个方块 创建一个方块将方块的左上角坐标和透明度添加到相应的列表中。 # 创建一个方块但是没有显示def create(self, rect_left_x, rect_left_y, alpha0.4):# 将方块的左上角坐标和透明度添加到相应的列表中self.rect_left_x_list.append(rect_left_x)self.rect_left_y_list.append(rect_left_y)self.alpha_list.append(alpha)self.square_count 13.更新显示方块的位置 根据方块的状态在图像上绘制方块并使用透明度将叠加图像叠加到原始图像上。 # 更新显示方块的位置def display(self, class_obj):# 遍历方块列表for i in range(0, self.square_count):x self.rect_left_x_list[i]y self.rect_left_y_list[i]alpha self.alpha_list[i]overlay class_obj.image.copy()# 如果方块处于激活状态绘制紫色方块否则绘制蓝色方块if (i self.active_index):cv2.rectangle(overlay, (x, y), (x self.rect_width, y self.rect_width), (255, 0, 255), -1)else:cv2.rectangle(overlay, (x, y), (x self.rect_width, y self.rect_width), (255, 0, 0), -1)# 使用透明度将叠加图像叠加到原始图像上class_obj.image cv2.addWeighted(overlay, alpha, class_obj.image, 1 - alpha, 0)4.判断落点方块 判断给定的坐标是否在方块内并返回方块的ID。 # 判断落在哪个方块上返回方块的IDdef checkOverlay(self, check_x, check_y):# 遍历方块列表for i in range(0, self.square_count):x self.rect_left_x_list[i]y self.rect_left_y_list[i]# 检查指定点是否在方块内if (x check_x (x self.rect_width)) and (y check_y (y self.rect_width)):# 保存被激活的方块IDself.active_index ireturn ireturn -15.计算距离、更新位置 ​​setLen​ 方法计算激活方块与指尖的距离。 ​​updateSquare​ 方法根据给定的新坐标更新激活方块的位置。 # 计算与指尖的距离def setLen(self, check_x, check_y):# 计算距离self.L1 check_x - self.rect_left_x_list[self.active_index]self.L2 check_y - self.rect_left_y_list[self.active_index]# 更新方块位置def updateSquare(self, new_x, new_y):self.rect_left_x_list[self.active_index] new_x - self.L1self.rect_left_y_list[self.active_index] new_y - self.L2三、识别控制类 1.初始化识别控制类 class HandControlVolume:def __init__(self):# 初始化mediapipeself.mp_drawing mp.solutions.drawing_utilsself.mp_drawing_styles mp.solutions.drawing_stylesself.mp_hands mp.solutions.hands# 中指与矩形左上角点的距离self.L1 0self.L2 0# image实例以便另一个类调用self.image NoneHandControlVolume用于初始化mediapipe以及存储中指与矩形左上角点的距离和image实例。 __init__ 方法在初始化对象时初始化mediapipe包括drawing_utils、drawing_styles和hands。此外还初始化了中指与矩形左上角点的距离和image实例。 通过mediapipe可以进行手部关键点检测和姿势估计进而进行手势识别和处理。为了使其他类能够调用image实例将其作为该类的属性进行存储方便地处理手势识别和控制操作。 2.主函数 这部分代码主要用于初始化和准备处理视频流以进行手势识别和交互。 def recognize(self):# 计算刷新率fpsTime time.time()# OpenCV读取视频流cap cv2.VideoCapture(0)# 视频分辨率resize_w int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))resize_h int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))# 画面显示初始化参数rect_percent_text 0# 初始化方块管理器squareManager SquareManager(150)# 创建多个方块for i in range(0, 5):squareManager.create(200 * i 20, 200, 0.6)with self.mp_hands.Hands(min_detection_confidence0.7,min_tracking_confidence0.5,max_num_hands2) as hands:while cap.isOpened():# 初始化矩形success, self.image cap.read()self.image cv2.resize(self.image, (resize_w, resize_h))if not success:print(空帧.)continueresize_w 和 resize_h根据摄像头分辨率获取的视频帧的宽度和高度并作为后续处理的图像尺寸进行缩放。 rect_percent_text画面显示初始化参数可能被用于屏幕上的文本显示。 squareManager初始化了方块管理器类的实例并设置方块的长度为150。 使用一个循环创建了五个方块并通过create方法将其添加到方块管理器中。进入循环从视频流中读取帧图像并将其调整为指定的尺寸。如果成功读取帧图像则会进一步处理否则将输出错误消息。 3.提高性能和处理图像 self.image.flags.writeable False# 转为RGBself.image cv2.cvtColor(self.image, cv2.COLOR_BGR2RGB)# 镜像self.image cv2.flip(self.image, 1)# mediapipe模型处理results hands.process(self.image)self.image.flags.writeable Trueself.image cv2.cvtColor(self.image, cv2.COLOR_RGB2BGR)self.image.flags.writeable False设置图像为不可写以提高性能并避免数据拷贝。 self.image cv2.cvtColor(self.image, cv2.COLOR_BGR2RGB)将BGR格式的图像转换为RGB格式因为mediapipe模型处理的输入图像需要是RGB格式。 self.image cv2.flip(self.image, 1)将图像进行镜像翻转以与mediapipe模型期望的手部位置对应。 results hands.process(self.image)将处理后的图像传递给mediapipe的hands模型进行手势识别和处理。 self.image cv2.cvtColor(self.image, cv2.COLOR_RGB2BGR)将图像从RGB格式转换回BGR格式以便后续的显示和处理。 4.检测手掌标记关键点和连接关系 if results.multi_hand_landmarks:# 遍历每个手掌for hand_landmarks in results.multi_hand_landmarks:# 在画面标注手指self.mp_drawing.draw_landmarks(self.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())if results.multi_hand_landmarks:检查是否检测到手掌。如果有检测到手掌则进入下一步处理否则跳过。 for hand_landmarks in results.multi_hand_landmarks:遍历检测到的每个手掌。 self.mp_drawing.draw_landmarks使用mediapipe的draw_landmarks方法在图像上标记手指的关键点和连接关系。 self.image输入的图像。hand_landmarks手掌的关键点。 self.mp_hands.HAND_CONNECTIONS手指之间的连接关系。 5.解析检测到的手掌并提取手指的关键点 检测到的手掌并提取手指的关键点然后将手指的坐标存储起来。 landmark_list []# 用来存储手掌范围的矩形坐标paw_x_list []paw_y_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])paw_x_list.append(finger_axis.x)paw_y_list.append(finger_axis.y)if landmark_list:# 比例缩放到像素ratio_x_to_pixel lambda x: math.ceil(x * resize_w)ratio_y_to_pixel lambda y: math.ceil(y * resize_h)# 设计手掌左上角、右下角坐标paw_left_top_x, paw_right_bottom_x map(ratio_x_to_pixel,[min(paw_x_list), max(paw_x_list)])paw_left_top_y, paw_right_bottom_y map(ratio_y_to_pixel,[min(paw_y_list), max(paw_y_list)])# 给手掌画框框cv2.rectangle(self.image, (paw_left_top_x - 30, paw_left_top_y - 30),(paw_right_bottom_x 30, paw_right_bottom_y 30), (0, 255, 0), 2)# 获取中指指尖坐标middle_finger_tip landmark_list[12]middle_finger_tip_x ratio_x_to_pixel(middle_finger_tip[1])middle_finger_tip_y ratio_y_to_pixel(middle_finger_tip[2])# 获取食指指尖坐标index_finger_tip landmark_list[8]index_finger_tip_x ratio_x_to_pixel(index_finger_tip[1])index_finger_tip_y ratio_y_to_pixel(index_finger_tip[2])# 中间点between_finger_tip (middle_finger_tip_x index_finger_tip_x) // 2, (middle_finger_tip_y index_finger_tip_y) // 2thumb_finger_point (middle_finger_tip_x, middle_finger_tip_y)index_finger_point (index_finger_tip_x, index_finger_tip_y) landmark_list一个列表用于存储手指的关键点信息。 paw_x_list 和 paw_y_list用于存储手掌范围的矩形框的横纵坐标。 在循环中将每个手指的关键点的索引、x坐标、y坐标和z坐标存储在landmark_list中同时将手掌范围的横纵坐标存储在paw_x_list和paw_y_list中。 如果landmark_list不为空即有手指的关键点被检测到ratio_x_to_pixel 和 ratio_y_to_pixel两个lambda函数用于将相对比例转换为像素坐标的函数。根据手掌范围的矩形坐标计算手掌区域的左上角和右下角坐标并画出方框。使用landmark_list中的信息获取中指指尖坐标和食指指尖坐标并将它们转换为像素坐标。计算中指指尖坐标和食指指尖坐标的中间点。将中指指尖的坐标和食指指尖的坐标存储在thumb_finger_point和index_finger_point中。 解析检测到的手掌信息并提取手指的关键点坐标将手指坐标转换为像素坐标并将中指指尖和食指指尖的位置标记在图像上。 6.绘制指尖圆圈和连接线计算距离 circle_func lambda point: cv2.circle(self.image, point, 10, (255, 0, 255), -1)self.image circle_func(thumb_finger_point)self.image circle_func(index_finger_point)self.image circle_func(between_finger_tip)# 画2点连线self.image cv2.line(self.image, thumb_finger_point, index_finger_point, (255, 0, 255), 5)# 勾股定理计算长度line_len math.hypot((index_finger_tip_x - middle_finger_tip_x),(index_finger_tip_y - middle_finger_tip_y))# 将指尖距离映射到文字rect_percent_text math.ceil(line_len)cv2.line函数在图像上绘制中指指尖和食指指尖之间的连接线。 math.hypot函数计算直角三角形斜边的长度。 将指尖之间的距离映射到rect_percent_text变量中用作后续文本显示的参数。 7.跟踪手指之间的距离 if squareManager.drag_active:# 更新方块squareManager.updateSquare(between_finger_tip[0], between_finger_tip[1])if (line_len 100):# 取消激活squareManager.drag_active FalsesquareManager.active_index -1elif (line_len 100) and (squareManager.checkOverlay(between_finger_tip[0],between_finger_tip[1]) ! -1) and (squareManager.drag_active False):# 激活squareManager.drag_active True# 计算距离squareManager.setLen(between_finger_tip[0], between_finger_tip[1])如果squareManager的drag_active属性为True即矩形的移动模式已经激活使用squareManager.updateSquare方法更新矩形的位置。如果两个手指之间的距离大于100即手指之间的距离超过了阈值取消矩形的激活模式将drag_active设置为False将active_index设置为-1。 否则如果两个手指之间的距离小于100且手指之间存在重叠的矩形并且矩形的移动模式未激活。激活矩形的移动模式将drag_active设置为True。根据手指之间的距离计算并设置矩形的长度使用squareManager.setLen方法。 8.显示图像 squareManager.display(self)# 显示距离cv2.putText(self.image, Distance: str(rect_percent_text), (10, 120), cv2.FONT_HERSHEY_PLAIN, 3,(255, 0, 0), 3)# 显示当前激活cv2.putText(self.image, Active: (None if squareManager.active_index -1 else str(squareManager.active_index)), (10, 170),cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 0), 3)# 显示刷新率FPScTime time.time()fps_text 1 / (cTime - fpsTime)fpsTime cTimecv2.putText(self.image, FPS: str(int(fps_text)), (10, 70),cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 0), 3)# 显示画面cv2.imshow(virtual drag and drop, self.image)if cv2.waitKey(5) 0xFF 27:breakcap.release()control HandControlVolume() control.recognize()主函数recognize的结尾部分用于显示图像、矩形的状态和刷新率并等待按键响应。使用squareManager.display方法显示矩形。cv2.waitKey函数等待按键输入如果按下的键是ESC键对应的ASCII码为27则退出循环。 在屏幕上显示处理后的图像、矩形的状态和刷新率并等待按键响应。这样可以实现交互式的虚拟拖放功能。接下来我们看一下实际的操作效果。 四、实战演示 通过演示我们可以实现通过手部对方块进行拖拽效果可以达到良好的状态。 五、源码分享 import cv2 import mediapipe as mp import time import math class SquareManager:def __init__(self, rect_width):# 方框长度self.rect_width rect_width# 方块listself.square_count 0self.rect_left_x_list []self.rect_left_y_list []self.alpha_list []# 中指与矩形左上角点的距离self.L1 0self.L2 0# 激活移动模式self.drag_active False# 激活的方块IDself.active_index -1# 创建一个方块但是没有显示def create(self, rect_left_x, rect_left_y, alpha0.4):self.rect_left_x_list.append(rect_left_x)self.rect_left_y_list.append(rect_left_y)self.alpha_list.append(alpha)self.square_count 1# 更新位置def display(self, class_obj):for i in range(0, self.square_count):x self.rect_left_x_list[i]y self.rect_left_y_list[i]alpha self.alpha_list[i]overlay class_obj.image.copy()if (i self.active_index):cv2.rectangle(overlay, (x, y), (x self.rect_width, y self.rect_width), (255, 0, 255), -1)else:cv2.rectangle(overlay, (x, y), (x self.rect_width, y self.rect_width), (255, 0, 0), -1)# Following line overlays transparent rectangle over the self.imageclass_obj.image cv2.addWeighted(overlay, alpha, class_obj.image, 1 - alpha, 0)# 判断落在哪个方块上返回方块的IDdef checkOverlay(self, check_x, check_y):for i in range(0, self.square_count):x self.rect_left_x_list[i]y self.rect_left_y_list[i]if (x check_x (x self.rect_width)) and (y check_y (y self.rect_width)):# 保存被激活的方块IDself.active_index ireturn ireturn -1# 计算与指尖的距离def setLen(self, check_x, check_y):# 计算距离self.L1 check_x - self.rect_left_x_list[self.active_index]self.L2 check_y - self.rect_left_y_list[self.active_index]# 更新方块 def updateSquare(self, new_x, new_y):# print(self.rect_left_x_list[self.active_index])self.rect_left_x_list[self.active_index] new_x - self.L1self.rect_left_y_list[self.active_index] new_y - self.L2# 识别控制类 class HandControlVolume:def __init__(self):# 初始化medialpipeself.mp_drawing mp.solutions.drawing_utilsself.mp_drawing_styles mp.solutions.drawing_stylesself.mp_hands mp.solutions.hands# 中指与矩形左上角点的距离self.L1 0self.L2 0# image实例以便另一个类调用self.image None# 主函数def recognize(self):# 计算刷新率fpsTime time.time()# OpenCV读取视频流cap cv2.VideoCapture(0)# 视频分辨率resize_w int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))resize_h int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))# 画面显示初始化参数rect_percent_text 0# 初始化方块管理器squareManager SquareManager(150)# 创建多个方块for i in range(0, 5):squareManager.create(200 * i 20, 200, 0.6)with self.mp_hands.Hands(min_detection_confidence0.7,min_tracking_confidence0.5,max_num_hands2) as hands:while cap.isOpened():# 初始化矩形success, self.image cap.read()self.image cv2.resize(self.image, (resize_w, resize_h))if not success:print(空帧.)continue# 提高性能self.image.flags.writeable False# 转为RGBself.image cv2.cvtColor(self.image, cv2.COLOR_BGR2RGB)# 镜像self.image cv2.flip(self.image, 1)# mediapipe模型处理results hands.process(self.image)self.image.flags.writeable Trueself.image cv2.cvtColor(self.image, cv2.COLOR_RGB2BGR)# 判断是否有手掌if results.multi_hand_landmarks:# 遍历每个手掌for hand_landmarks in results.multi_hand_landmarks:# 在画面标注手指self.mp_drawing.draw_landmarks(self.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 []# 用来存储手掌范围的矩形坐标paw_x_list []paw_y_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])paw_x_list.append(finger_axis.x)paw_y_list.append(finger_axis.y)if landmark_list:# 比例缩放到像素ratio_x_to_pixel lambda x: math.ceil(x * resize_w)ratio_y_to_pixel lambda y: math.ceil(y * resize_h)# 设计手掌左上角、右下角坐标paw_left_top_x, paw_right_bottom_x map(ratio_x_to_pixel,[min(paw_x_list), max(paw_x_list)])paw_left_top_y, paw_right_bottom_y map(ratio_y_to_pixel,[min(paw_y_list), max(paw_y_list)])# 给手掌画框框cv2.rectangle(self.image, (paw_left_top_x - 30, paw_left_top_y - 30),(paw_right_bottom_x 30, paw_right_bottom_y 30), (0, 255, 0), 2)# 获取中指指尖坐标middle_finger_tip landmark_list[12]middle_finger_tip_x ratio_x_to_pixel(middle_finger_tip[1])middle_finger_tip_y ratio_y_to_pixel(middle_finger_tip[2])# 获取食指指尖坐标index_finger_tip landmark_list[8]index_finger_tip_x ratio_x_to_pixel(index_finger_tip[1])index_finger_tip_y ratio_y_to_pixel(index_finger_tip[2])# 中间点between_finger_tip (middle_finger_tip_x index_finger_tip_x) // 2, (middle_finger_tip_y index_finger_tip_y) // 2# print(middle_finger_tip_x)thumb_finger_point (middle_finger_tip_x, middle_finger_tip_y)index_finger_point (index_finger_tip_x, index_finger_tip_y)# 画指尖2点circle_func lambda point: cv2.circle(self.image, point, 10, (255, 0, 255), -1)self.image circle_func(thumb_finger_point)self.image circle_func(index_finger_point)self.image circle_func(between_finger_tip)# 画2点连线self.image cv2.line(self.image, thumb_finger_point, index_finger_point, (255, 0, 255), 5)# 勾股定理计算长度line_len math.hypot((index_finger_tip_x - middle_finger_tip_x),(index_finger_tip_y - middle_finger_tip_y))# 将指尖距离映射到文字rect_percent_text math.ceil(line_len)# 激活模式需要让矩形跟随移动if squareManager.drag_active:# 更新方块squareManager.updateSquare(between_finger_tip[0], between_finger_tip[1])if (line_len 100):# 取消激活squareManager.drag_active FalsesquareManager.active_index -1elif (line_len 100) and (squareManager.checkOverlay(between_finger_tip[0],between_finger_tip[1]) ! -1) and (squareManager.drag_active False):# 激活squareManager.drag_active True# 计算距离squareManager.setLen(between_finger_tip[0], between_finger_tip[1])# 显示方块传入本实例主要为了半透明的处理squareManager.display(self)# 显示距离cv2.putText(self.image, Distance: str(rect_percent_text), (10, 120), cv2.FONT_HERSHEY_PLAIN, 3,(255, 0, 0), 3)# 显示当前激活cv2.putText(self.image, Active: (None if squareManager.active_index -1 else str(squareManager.active_index)), (10, 170),cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 0), 3)# 显示刷新率FPScTime time.time()fps_text 1 / (cTime - fpsTime)fpsTime cTimecv2.putText(self.image, FPS: str(int(fps_text)), (10, 70),cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 0), 3)# 显示画面cv2.imshow(virtual drag and drop, self.image)if cv2.waitKey(5) 0xFF 27:breakcap.release()control HandControlVolume() control.recognize()
http://www.zqtcl.cn/news/184173/

相关文章:

  • 做网站熊掌号软件设计公司排名
  • 深圳 做网站学做西点的网站
  • 静态网站安全性百度服务平台
  • 网站vi设计公司网站建设app
  • 书店网站建设策划书总结每天看七个广告赚40元的app
  • 做网站的属于什么专业成都广告制作安装公司
  • 天津市网站建设公司网站制作费用
  • 网站制作公司 郑州wordpress图片中文不显示解决
  • 网站建设模式有哪些方面jquery做的装修网站
  • 佛山手机建网站企业网站公司单位有哪些
  • 给企业做网站的平台有没有专门做衣服搭配的网站
  • 青岛本地网站最近军事新闻大事
  • 潍坊哪里有做360网站的成都官微最新发布
  • 还有哪些网站可以做淘宝活动企业建设网站的方式
  • 上海技术公司做网站2022引流人脉推广软件
  • 网站排名优化技术安徽省城乡和建设厅网站
  • 平阴县建设工程网站英文网站模板制作
  • 网站制作超链接怎么做厦门公司建站
  • 阿里云做的网站怎么备份建筑设计网站issuu
  • 网上做设计网站广西做网站找谁
  • 网站优化成本建设项目网站备案申请表
  • 做公众号首图网站上海短期网站建设培训
  • 网站开发最好佛山优化网站排名
  • 服务器搭建网站打不开网站建设信息平台
  • 宽屏蓝色企业网站源码如何编辑网站标题
  • 免费搭建手机网站广告公司怎么取名
  • 网站抓取超时错误c 高性能网站开发
  • 营销导向企业网站策划wordpress 不显示菜单
  • 特效视频网站用.net做视频网站的案例
  • 网站建设实用的网站视屏网站的审核是怎么做的