首页 > 其他分享 >图像处理案例02

图像处理案例02

时间:2024-08-02 16:44:10浏览次数:10  
标签:02 box index frame cv2 案例 图像处理 finger mp

手指拖拽屏幕上的方块儿

1 步骤:

1.opencv获取视频流
2.获取手指关节关键点坐标
3.判断手指是否在方块上
4.如果在方块上,方块跟着手指移动

2 代码

import cv2
import numpy as np
import math
import mediapipe as mp

## 检测手掌参数设置
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
mp_hands = mp.solutions.hands
# 获取手的21个关节
hands = mp_hands.Hands(
    model_complexity=0,
    min_detection_confidence=0.5,
    min_tracking_confidence=0.5)
# 获取摄像头的视频流
cap = cv2.VideoCapture(0)

# 获取画面宽度,高度
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 方块的相关参数
## box左上角坐标、宽度、颜色
box_x = 100
box_y = 100
box_width = 100
box_high  = 120
box_color = (255, 0, 255)
## 阈值,当食指和中指指尖距离大于阈值时,停止移动box
threth = 80
## 食指指尖与box左上角坐标的距离
d1 = 0
d2 = 0
## 食指指尖是否在方块上
on_box = False

while True:
    # 1. 读取每一帧
    ret, frame = cap.read()
    # 对图像进行处理
    # 镜像处理,对y轴进行翻转
    frame = cv2.flip(frame, 1)

    # mediapipe处理RGB通道的图像
    frame.flags.writeable = False
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    ## 2.手掌检测RGB图像
    results = hands.process(frame)

    frame.flags.writeable = True
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
    # 判断是否检测到手掌
    if results.multi_hand_landmarks:
        # 遍历每一只手掌
        for hand_landmarks in results.multi_hand_landmarks:
            # 绘制手掌的21个关键点
            mp_drawing.draw_landmarks(
                frame,
                hand_landmarks,
                mp_hands.HAND_CONNECTIONS,
                mp_drawing_styles.get_default_hand_landmarks_style(),
                mp_drawing_styles.get_default_hand_connections_style()
            )
            # 保存手掌的21个x,y的坐标
            x_list = []
            y_list = []
            for landmark in hand_landmarks.landmark:  # 会循环21次把手的关节弄好
                # 添加x坐标
                x_list.append(landmark.x)  # append表示添加x坐标
                # 添加y坐标
                y_list.append(landmark.y)
            # 获取食指指尖xy坐标
            index_finger_x = int(x_list[8] * width)
            index_finger_y = int(y_list[8] * height)
            # 获取中指指尖,用于退出方块
            middle_finger_x = int(x_list[12] * width)
            middle_finger_y = int(y_list[12] * height)
            # 计算食指指尖和中指指尖的欧式距离
            finger_len = math.hypot((index_finger_x - middle_finger_x),
                                    (index_finger_y - middle_finger_y))

            if finger_len < threth:
                # 3. 判断指尖是否在方块上面
                if (box_x < index_finger_x < box_x + box_width and box_y < index_finger_y < box_y + box_high):
                    if on_box == False:
                        ## 如果食指在box内移动,则保持d1、d2不更新,即box与食指的相对位置不变
                        d1 = abs(index_finger_x - box_x)
                        d2 = abs(index_finger_y - box_y)
                        on_box = True
                        ## 如果食指在box上,则变换box为水红色
                        box_color = (255, 0, 255)
            else:
                on_box = False
                ## 如果食指不在box上,则变换box为蓝颜
                box_color = (255, 0, 0)

            if on_box:  # 如果手指在方块上面        
                box_x = index_finger_x - d1  # 根据算法
                box_y = index_finger_y - d2
    # 4. 画出box
    cv2.rectangle(frame, (box_x, box_y), (box_x + box_width, box_y + box_high), box_color, -1)
    frame = cv2.addWeighted(frame.copy(), 0.5, frame, 0.5, 0)  # 做一个半透明

    # 显示图像
    cv2.imshow('Box drag', frame)
    # 退出条件
    if cv2.waitKey(10) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

标签:02,box,index,frame,cv2,案例,图像处理,finger,mp
From: https://www.cnblogs.com/shanjuqiuming/p/18339048

相关文章

  • 【学术会议征稿】第二届智能通信与网络国际学术会议(ICN 2024)
    第二届智能通信与网络国际学术会议(ICN2024)The 2ndInternationalConferenceonIntelligentCommunicationandNetworking第二届智能通信与网络国际学术会议(ICN2024)将于2024年11月15-17日在中国沈阳召开。ICN2024将围绕智能通信与网络的最新研究领域,为来自国内外高等......
  • SQL进阶技巧:Hive如何巧解和差计算的递归问题?【应用案例2】
    目录0问题描述1数据准备2问题分析3小结 0问题描述有如下数据:反应了每月的页面浏览量现需要按照如下规则计算每月的累计阅读量,具体计算规则如下:最终结果如下:1数据准备withdataas(select'2024-01'asmonth,2aspvunionallselect'2024-02'asm......
  • 【学术会议征稿】第三届图像处理、计算机视觉与机器学习国际学术会议(ICICML 2024)
    第三届图像处理、计算机视觉与机器学习国际学术会议(ICICML2024)20243rd InternationalConferenceonImageProcessing,ComputerVisionandMachineLearning 重要信息大会官网:参会投稿/了解会议详情大会时间:2024年11月22日-24日 大会地点:中国深圳接受/拒稿......
  • 网络安全(黑客)——自学2024
    一、什么是网络安全网络安全是一种综合性的概念,涵盖了保护计算机系统、网络基础设施和数据免受未经授权的访问、攻击、损害或盗窃的一系列措施和技术。经常听到的“红队”、“渗透测试”等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。作为......
  • 2024年网络安全学习指南!详尽路线图,从零基础到黑客高手的进阶之路!_网络安全自学路线图
    零基础小白,到就业!入门到入土的网安/黑客学习路线!建议的学习顺序:一、网络安全学习普法(心里有个数,要进去坐几年!)1、了解并介绍《网络安全法》2、《全国人大常委会关于维护互联网安全的决定》3、《中华人民共和国计算机信息系统安全保护条例(2011年修正)》4、《中华人民共......
  • 【笔记】计数选讲:容斥、LGV、集合幂级数、GF 2024.8.2
    今天写的很乱。[HEOI2013]SAO容斥。因为我们已经知道父亲\(<\)儿子时的情况(\(n!/\prod_isiz_i\),也适用于森林),那么儿子\(<\)父亲的情况就容斥掉,无限制的就当作那条边不存在。树上背包,记录当前节点为根的连通块大小和容斥系数的积。*[ECFinal23A]DFSOrder4转写为:统计多......
  • Burp Suite Professional 2024.7 发布 - Web 应用安全、测试和扫描
    BurpSuiteProfessional2024.7(macOS,Linux,Windows)-Web应用安全、测试和扫描BurpSuiteProfessional,Test,find,andexploitvulnerabilities.请访问原文链接:https://sysin.org/blog/burp-suite-pro/,查看最新版。原创作品,转载请保留出处。BurpSuiteProfessiona......
  • 2024牛客暑期多校训练营6 K.The Great Wall 2
    题意给定长为\(n\)的序列\(\{a_i\}\),分成恰好\(k\)个非空连续段使得这\(k\)的极差之和最小,对\(k=1,2,\cdots,n\)分别求解。\(n\le5000\)做法定义:令\(f_{i,j}\)为将前\(i\)个数分成\(j\)段的最小极差之和,令\(w_{l,r}\)为\(a_l,\cdots,a_r\)的极差。按\(j=1\simn\)按层转移:......
  • [AGC023F] 01 on Tree
    题意给定一棵\(n\)个节点的树,每个点都有权值\(0/1\),每次删除一个没有父亲的节点,并将权值放在序列末尾。求该序列最小的逆序对数。Sol删除不好做,只能\(\text{dp}\)。考虑把删除改成合并,每次合并\(x\)和\(fa_x\)表示将\(x\)紧接在\(fa_x\)后面。这样维护\(n\)个......
  • 2024年cisp考试时间及费用
    虽然CISP每个月都有考试,但每个地方考试时间不同,很多小伙伴都在问:2024年cisp考试时间是什么时候?CISP要多少钱?今天将cisp考试时间及费用一次性给大家讲清楚!一、2024年各地CISP考试时间CISP考试时间会提前公布,2024年8-12月各地CISP考试时间具体如下:2024年北京CISP考试时间:8月2......