• 【Python】计算机视觉 手掌图片穴位识别


    返回至系列文章导航博客


    在这里插入图片描述

    1 简要介绍

    说明:此方法可能有一定的缺陷,但是我认为有一定的实现可能所以做了这个板块。倘若有专业的中医医生或者相关工作者对此有建议或者意见可以与我联系交流哦~
    关于手掌我这里有手掌的图片数据集可供大家下载:手掌数据集

    穴位按摩是中国医学的重要组成部分,它是以中国医学理论为指导,以经络腧穴学说为基础,以按摩为主要施治,用来防病治病的一种手段。为方便用户可以随时随地按摩手部穴位,中e诊开发了智能手部穴位定位系统,使用户可以准确地找到手心与手背的穴位。具体功能为用户上传一张其手心或手背照片,系统会自动定位照片中的穴位坐标,并在图中标记处穴位位置,并将标记图片返回给用户。以左手手心为例,操作结果如下图所示:

    在这里插入图片描述

    在这里插入图片描述

    2 技术详情

    为准确定位到图像中的手掌位置,本小组利用mediapipe开发的手部界标模型(MediaPipe Hands)定位到手部关键节点。MediaPipe Hands 是一种高保真手和手指跟踪解决方案。它使用机器学习 (ML) 从单帧中推断出一只手的 21 个 3D 地标。具体21个3D地标如下图所示:

    在这里插入图片描述

    通过MedisPipe Hands手掌定位地标分析,可将上一节中的用户图片代入分析,计算该图手掌的关键节点。计算效果如下图所示:

    在这里插入图片描述

    在明确手掌在图中的关键节点后。本小组通过查阅大量中医文献书籍与资料,找到常见的手掌穴位在手部的相对位置。通过手部关键节点的位置坐标,采用欧式距离计算出图像中穴位的位置坐标并进行标注。同时,可以通过拇指指尖二维纵坐标与小拇指指尖二维纵坐标的大小判断图像中的是手心或是手背。手背智能穴位定位效果如下图所示:

    在这里插入图片描述

    3 代码实现

    3.1 导入相应的库

    import cv2 as cv
    import numpy as np
    import mediapipe as mp
    import  tqdm
    import time
    import  matplotlib.pyplot as plt
    from PIL import Image, ImageDraw, ImageFont
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    ps:在导入cv2时我遇到了一个报错“DLL load failed while importing cv2: 找不到指定的模”。若大家也遇到这种问题可至成功解决Python导入opencv报错“DLL load failed while importing cv2: 找不到指定的模”查看解决方法。

    3.2 定义在图片中画点写字的函数

    这一步方便在计算出穴位坐标后利用该函数对图片进行标记。

    def cv2ImgAddText(img, text, left, top, textColor=(0, 255, 0), textSize=20):
        if (isinstance(img, np.ndarray)):  # 判断是否OpenCV图片类型
            img = Image.fromarray(cv.cvtColor(img, cv.COLOR_BGR2RGB))
        # 创建一个可以在给定图像上绘图的对象
        draw = ImageDraw.Draw(img)
        # 字体的格式
        fontStyle = ImageFont.truetype(
            "simsun.ttc", textSize, encoding="utf-8")
        # 绘制文本
        draw.text((left, top), text, textColor, font=fontStyle)
        # 转换回OpenCV格式
        return cv.cvtColor(np.asarray(img), cv.COLOR_RGB2BGR)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3.3 定义手部关键点监测模型并导入

    # 手部关键点检测模型
    mp_hand=mp.solutions.hands
    
    # 导入模型
    hands=mp_hand.Hands(static_image_mode=False,
                        max_num_hands=1,
                        min_detection_confidence=0.3,
                        min_tracking_confidence=0.3
                        )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3.4 导入绘图函数

    # 导入绘图函数
    mpDraw=mp.solutions.drawing_utils
    img=cv.imread(r'C:\Users\13267\Desktop\test\hand2.jpg')#需要标记的手掌图片的位置
    #look_img(img)
    img_RGB=cv.cvtColor(img,cv.COLOR_BGR2RGB)
    results=hands.process(img_RGB)
    lmList = []
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.5 将原本三维的坐标系转为2维方便平面坐标计算

    if results.multi_hand_landmarks:
        for handLms in results.multi_hand_landmarks:
            for id, lm in enumerate(handLms.landmark):
                h, w, c = img.shape
                cx, cy = int(lm.x * w), int(lm.y * h)
                lmList.append([id, cx, cy])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.6 计算手部穴位的函数

    这里利用了小拇指指尖坐标与大拇指指尖坐标的相对位置来判断图片是手掌还是手背。目前仅能左手来测试!

    if lmList[12][2] < lmList[0][2]:
        if lmList[4][1] < lmList[20][1]:
            print('手心')
            cx0,cy0 = lmList[0][1],lmList[0][2]
            cx1 ,cy1 =  lmList[1][1],lmList[1][2]
            img = cv2ImgAddText(img, "鱼际穴", cx1, cy1, (0,0,0), 30)
            cv.circle(img, (cx1, cy1), 10, (255, 0, 255), cv.FILLED)
            cx4,cy4 = lmList[4][1],lmList[4][2]
            img = cv2ImgAddText(img, "十宣穴1", cx4, cy4, (0,0,0), 30)
            cv.circle(img, (cx4, cy4), 10, (255, 0, 255), cv.FILLED)
            cx6,cy6 = lmList[6][1],lmList[6][2]
            img = cv2ImgAddText(img, "四缝穴1", cx6, cy6, (0,0,0), 30)
            cv.circle(img, (cx6, cy6), 10, (255, 0, 255), cv.FILLED)
            cx8,cy8 = lmList[8][1],lmList[8][2]
            img = cv2ImgAddText(img, "十宣穴2", cx8, cy8, (0,0,0), 30)
            cv.circle(img, (cx8, cy8), 10, (255, 0, 255), cv.FILLED)
            cx9,cy9 = lmList[9][1],lmList[9][2]
            cv.circle(img, ((3*cx9+cx0)//4, (3*cy9+cy0)//4), 10, (255, 0, 255), cv.FILLED)
            img = cv2ImgAddText(img, "劳宫穴", (3*cx9+cx0)//4, (3*cy9+cy0)//4, (0,0,0), 30)
            x_center,y_center=(cx9+cx0)//2, (cy9+cy0)//2
            cx10,cy10 = lmList[10][1],lmList[10][2]
            img = cv2ImgAddText(img, "四缝穴2", cx10, cy10, (0,0,0), 30)
            cv.circle(img, (cx10, cy10), 10, (255, 0, 255), cv.FILLED)
            cx11 , cy11 = lmList[11][1],lmList[11][2]
            cx12 , cy12 = lmList[12][1],lmList[12][2]
            img = cv2ImgAddText(img, "十宣穴3", cx12, cy12, (0,0,0), 30)
            cv.circle(img, (cx12, cy12), 10, (255, 0, 255), cv.FILLED)
            img = cv2ImgAddText(img, "中冲穴", (2*cx12+cx11)//3, (2*cy12+cy11)//3, (0,0,0), 30)
            cv.circle(img, ((2*cx12+cx11)//3, (2*cy12+cy11)//3), 10, (255, 0, 255), cv.FILLED)
            cx14,cy14 = lmList[14][1],lmList[14][2]
            img = cv2ImgAddText(img, "四缝穴3", cx14, cy14, (0,0,0), 30)
            cv.circle(img, (cx14, cy14), 10, (255, 0, 255), cv.FILLED)
            cx16,cy16 = lmList[16][1],lmList[16][2]
            img = cv2ImgAddText(img, "十宣穴4", cx16, cy16, (0,0,0), 30)
            cv.circle(img, (cx16, cy16), 10, (255, 0, 255), cv.FILLED)
            cx17,cy17 = lmList[17][1],lmList[17][2]
            img = cv2ImgAddText(img, "少府穴", (3*cx17+cx0)//4, (3*cy17+cy0)//4, (0,0,0), 30)
            cv.circle(img, ((3*cx17+cx0)//4, (3*cy17+cy0)//4), 10, (255, 0, 255), cv.FILLED)
            cx18,cy18 = lmList[18][1],lmList[18][2]
            img = cv2ImgAddText(img, "四缝穴4", cx18, cy18, (0,0,0), 30)
            cv.circle(img, (cx18, cy18), 10, (255, 0, 255), cv.FILLED)
            cx20,cy20 = lmList[20][1],lmList[20][2]
            img = cv2ImgAddText(img, "十宣穴5", cx20, cy20, (0,0,0), 30)
            cv.circle(img, (cx20, cy20), 10, (255, 0, 255), cv.FILLED)
            cv.imwrite(r'C:\Users\13267\Desktop\test\hands2.jpg',img)#标记后的图片存储位置
        else:
            print('手背')
            cx0,cy0 = lmList[0][1],lmList[0][2]
            cx1,cy1 = lmList[1][1],lmList[1][2]
            x_zhongquan,y_zhongquan = (3*cx0+cx1)//4,(3*cy0+cy1)//4
            img = cv2ImgAddText(img, "中泉穴", x_zhongquan,y_zhongquan, (0,0,0), 20)
            cv.circle(img, (x_zhongquan, y_zhongquan), 10, (255, 0, 255), cv.FILLED)
            cx2 ,cy2 =  lmList[2][1],lmList[2][2]
            cx3 ,cy3 =  lmList[3][1],lmList[3][2]
            img = cv2ImgAddText(img, "大骨空穴", cx3,cy3, (0,0,0), 20)
            cv.circle(img, (cx3, cy3), 10, (255, 0, 255), cv.FILLED)
            cx4,cy4 = lmList[4][1],lmList[4][2]
            x_shaoshang,y_shaoshang = (cx3+cx4)//2,(cy3+cy4)//2
            img = cv2ImgAddText(img, "少商穴", x_shaoshang,y_shaoshang, (0,0,0), 20)
            cv.circle(img, (x_shaoshang, y_shaoshang), 10, (255, 0, 255), cv.FILLED)
            img = cv2ImgAddText(img, "十宣穴1", cx4,cy4, (0,0,0), 20)
            cv.circle(img, (cx4, cy4), 10, (255, 0, 255), cv.FILLED)
            cx5,cy5 = lmList[5][1],lmList[5][2]
            x_053,y_053 = (3*cx5+cx0)//4,(3*cy5+cy0)//4
            x_05,y_05 = (cx5+cx0)//2,(cy5+cy0)//2
            x_sanjian,y_sanjian = (x_053+cx2)//2,(y_053+cy2)//2
            x_hegu,y_hegu = (x_05+cx2)//2,(y_05+cy2)//2
            img = cv2ImgAddText(img, "三间穴", x_sanjian,y_sanjian, (0,0,0), 20)
            cv.circle(img, (x_sanjian, y_sanjian), 10, (255, 0, 255), cv.FILLED)
            img = cv2ImgAddText(img, "合谷穴", x_hegu,y_hegu, (0,0,0), 20)
            cv.circle(img, (x_hegu, y_hegu), 10, (255, 0, 255), cv.FILLED)
            x_baxie1,y_baxie1 = (cx2+cx5)//2,(cy2+cy5)//2
            img = cv2ImgAddText(img, "八邪穴1", x_baxie1,y_baxie1, (0,0,0), 20)
            cv.circle(img, (x_baxie1, y_baxie1), 10, (255, 0, 255), cv.FILLED)
            x_yaotong1,y_yaotong1=(cx5+cx0)//2,(cy5+cy0)//2
            img = cv2ImgAddText(img, "腰痛点1", x_yaotong1,y_yaotong1, (0,0,0), 20)
            cv.circle(img, (x_yaotong1, y_yaotong1), 10, (255, 0, 255), cv.FILLED)
            cx8,cy8 = lmList[8][1],lmList[8][2]
            img = cv2ImgAddText(img, "十宣穴2", cx8,cy8, (0,0,0), 20)
            cv.circle(img, (cx8, cy8), 10, (255, 0, 255), cv.FILLED)
            cx9 ,cy9 =  lmList[9][1],lmList[9][2]
            x_baxie2,y_baxie2 = (cx9+cx5)//2,(cy9+cy5)//2
            img = cv2ImgAddText(img, "八邪穴2", x_baxie2,y_baxie2, (0,0,0), 20)
            cv.circle(img, (x_baxie2, y_baxie2), 10, (255, 0, 255), cv.FILLED)
            cx10 ,cy10 =  lmList[10][1],lmList[10][2]
            img = cv2ImgAddText(img, "中魁穴", cx10,cy10, (0,0,0), 20)
            cv.circle(img, (cx10, cy10), 10, (255, 0, 255), cv.FILLED)
            cx12 ,cy12 =  lmList[12][1],lmList[12][2]
            img = cv2ImgAddText(img, "十宣穴3", cx12,cy12, (0,0,0), 20)
            cv.circle(img, (cx12, cy12), 10, (255, 0, 255), cv.FILLED)
            cx13 ,cy13 =  lmList[13][1],lmList[13][2]
            x_baxie3,y_baxie3 = (cx9+cx13)//2,(cy9+cy13)//2
            img = cv2ImgAddText(img, "八邪穴3", x_baxie3,y_baxie3, (0,0,0), 20)
            cv.circle(img, (x_baxie3, y_baxie3), 10, (255, 0, 255), cv.FILLED)
            x_yaotong2,y_yaotong2 = (cx0+cx13)//2,(cy0+cy13)//2
            img = cv2ImgAddText(img, "腰痛点2", x_yaotong2,y_yaotong2, (0,0,0), 20)
            cv.circle(img, (x_yaotong2, y_yaotong2), 10, (255, 0, 255), cv.FILLED)
            cx16,cy16 =  lmList[16][1],lmList[16][2]
            img = cv2ImgAddText(img, "十宣穴4", cx16,cy16, (0,0,0), 20)
            cv.circle(img, (cx16, cy16), 10, (255, 0, 255), cv.FILLED)
            cx17,cy17 =  lmList[17][1],lmList[17][2]
            img = cv2ImgAddText(img, "后溪穴", cx17,cy17, (0,0,0), 20)
            cv.circle(img, (cx17, cy17), 10, (255, 0, 255), cv.FILLED)
            x_baxie4,y_baxie4 = (cx13+cx17)//2,(cy13+cy17)//2
            img = cv2ImgAddText(img, "八邪穴4", x_baxie4,y_baxie4, (0,0,0), 20)
            cv.circle(img, (x_baxie4, y_baxie4), 10, (255, 0, 255), cv.FILLED)
            cx18,cy18 =  lmList[18][1],lmList[18][2]
            img = cv2ImgAddText(img, "小骨空穴", cx18,cy18, (0,0,0), 20)
            cv.circle(img, (cx18, cy18), 10, (255, 0, 255), cv.FILLED)
            cx20,cy20 =  lmList[20][1],lmList[20][2]
            img = cv2ImgAddText(img, "十宣穴5", cx20,cy20, (0,0,0), 20)
            cv.circle(img, (cx20, cy20), 10, (255, 0, 255), cv.FILLED)
            cv.imwrite(r'C:\Users\13267\Desktop\test\hands2.jpg',img)#标记后的图片存储位置
    else:
        if lmList[4][1] > lmList[20][1]:
            print('手心')
            cx0,cy0 = lmList[0][1],lmList[0][2]
            cx1 ,cy1 =  lmList[1][1],lmList[1][2]
            img = cv2ImgAddText(img, "鱼际穴", cx1, cy1, (0,0,0), 30)
            cv.circle(img, (cx1, cy1), 10, (255, 0, 255), cv.FILLED)
            cx4,cy4 = lmList[4][1],lmList[4][2]
            img = cv2ImgAddText(img, "十宣穴1", cx4, cy4, (0,0,0), 30)
            cv.circle(img, (cx4, cy4), 10, (255, 0, 255), cv.FILLED)
            cx6,cy6 = lmList[6][1],lmList[6][2]
            img = cv2ImgAddText(img, "四缝穴1", cx6, cy6, (0,0,0), 30)
            cv.circle(img, (cx6, cy6), 10, (255, 0, 255), cv.FILLED)
            cx8,cy8 = lmList[8][1],lmList[8][2]
            img = cv2ImgAddText(img, "十宣穴2", cx8, cy8, (0,0,0), 30)
            cv.circle(img, (cx8, cy8), 10, (255, 0, 255), cv.FILLED)
            cx9,cy9 = lmList[9][1],lmList[9][2]
            cv.circle(img, ((3*cx9+cx0)//4, (3*cy9+cy0)//4), 10, (255, 0, 255), cv.FILLED)
            img = cv2ImgAddText(img, "劳宫穴", (3*cx9+cx0)//4, (3*cy9+cy0)//4, (0,0,0), 30)
            x_center,y_center=(cx9+cx0)//2, (cy9+cy0)//2
            cx10,cy10 = lmList[10][1],lmList[10][2]
            img = cv2ImgAddText(img, "四缝穴2", cx10, cy10, (0,0,0), 30)
            cv.circle(img, (cx10, cy10), 10, (255, 0, 255), cv.FILLED)
            cx11 , cy11 = lmList[11][1],lmList[11][2]
            cx12 , cy12 = lmList[12][1],lmList[12][2]
            img = cv2ImgAddText(img, "十宣穴3", cx12, cy12, (0,0,0), 30)
            cv.circle(img, (cx12, cy12), 10, (255, 0, 255), cv.FILLED)
            img = cv2ImgAddText(img, "中冲穴", (2*cx12+cx11)//3, (2*cy12+cy11)//3, (0,0,0), 30)
            cv.circle(img, ((2*cx12+cx11)//3, (2*cy12+cy11)//3), 10, (255, 0, 255), cv.FILLED)
            cx14,cy14 = lmList[14][1],lmList[14][2]
            img = cv2ImgAddText(img, "四缝穴3", cx14, cy14, (0,0,0), 30)
            cv.circle(img, (cx14, cy14), 10, (255, 0, 255), cv.FILLED)
            cx16,cy16 = lmList[16][1],lmList[16][2]
            img = cv2ImgAddText(img, "十宣穴4", cx16, cy16, (0,0,0), 30)
            cv.circle(img, (cx16, cy16), 10, (255, 0, 255), cv.FILLED)
            cx17,cy17 = lmList[17][1],lmList[17][2]
            img = cv2ImgAddText(img, "少府穴", (3*cx17+cx0)//4, (3*cy17+cy0)//4, (0,0,0), 30)
            cv.circle(img, ((3*cx17+cx0)//4, (3*cy17+cy0)//4), 10, (255, 0, 255), cv.FILLED)
            cx18,cy18 = lmList[18][1],lmList[18][2]
            img = cv2ImgAddText(img, "四缝穴4", cx18, cy18, (0,0,0), 30)
            cv.circle(img, (cx18, cy18), 10, (255, 0, 255), cv.FILLED)
            cx20,cy20 = lmList[20][1],lmList[20][2]
            img = cv2ImgAddText(img, "十宣穴5", cx20, cy20, (0,0,0), 30)
            cv.circle(img, (cx20, cy20), 10, (255, 0, 255), cv.FILLED)
            cv.imwrite(r'C:\Users\13267\Desktop\test\hands2.jpg',img)#标记后的图片存储位置
        else:
            print('手背')
            cx0,cy0 = lmList[0][1],lmList[0][2]
            cx1,cy1 = lmList[1][1],lmList[1][2]
            x_zhongquan,y_zhongquan = (3*cx0+cx1)//4,(3*cy0+cy1)//4
            img = cv2ImgAddText(img, "中泉穴", x_zhongquan,y_zhongquan, (0,0,0), 20)
            cv.circle(img, (x_zhongquan, y_zhongquan), 10, (255, 0, 255), cv.FILLED)
            cx2 ,cy2 =  lmList[2][1],lmList[2][2]
            cx3 ,cy3 =  lmList[3][1],lmList[3][2]
            img = cv2ImgAddText(img, "大骨空穴", cx3,cy3, (0,0,0), 20)
            cv.circle(img, (cx3, cy3), 10, (255, 0, 255), cv.FILLED)
            cx4,cy4 = lmList[4][1],lmList[4][2]
            x_shaoshang,y_shaoshang = (cx3+cx4)//2,(cy3+cy4)//2
            img = cv2ImgAddText(img, "少商穴", x_shaoshang,y_shaoshang, (0,0,0), 20)
            cv.circle(img, (x_shaoshang, y_shaoshang), 10, (255, 0, 255), cv.FILLED)
            img = cv2ImgAddText(img, "十宣穴1", cx4,cy4, (0,0,0), 20)
            cv.circle(img, (cx4, cy4), 10, (255, 0, 255), cv.FILLED)
            cx5,cy5 = lmList[5][1],lmList[5][2]
            x_053,y_053 = (3*cx5+cx0)//4,(3*cy5+cy0)//4
            x_05,y_05 = (cx5+cx0)//2,(cy5+cy0)//2
            x_sanjian,y_sanjian = (x_053+cx2)//2,(y_053+cy2)//2
            x_hegu,y_hegu = (x_05+cx2)//2,(y_05+cy2)//2
            img = cv2ImgAddText(img, "三间穴", x_sanjian,y_sanjian, (0,0,0), 20)
            cv.circle(img, (x_sanjian, y_sanjian), 10, (255, 0, 255), cv.FILLED)
            img = cv2ImgAddText(img, "合谷穴", x_hegu,y_hegu, (0,0,0), 20)
            cv.circle(img, (x_hegu, y_hegu), 10, (255, 0, 255), cv.FILLED)
            x_baxie1,y_baxie1 = (cx2+cx5)//2,(cy2+cy5)//2
            img = cv2ImgAddText(img, "八邪穴1", x_baxie1,y_baxie1, (0,0,0), 20)
            cv.circle(img, (x_baxie1, y_baxie1), 10, (255, 0, 255), cv.FILLED)
            x_yaotong1,y_yaotong1=(cx5+cx0)//2,(cy5+cy0)//2
            img = cv2ImgAddText(img, "腰痛点1", x_yaotong1,y_yaotong1, (0,0,0), 20)
            cv.circle(img, (x_yaotong1, y_yaotong1), 10, (255, 0, 255), cv.FILLED)
            cx8,cy8 = lmList[8][1],lmList[8][2]
            img = cv2ImgAddText(img, "十宣穴2", cx8,cy8, (0,0,0), 20)
            cv.circle(img, (cx8, cy8), 10, (255, 0, 255), cv.FILLED)
            cx9 ,cy9 =  lmList[9][1],lmList[9][2]
            x_baxie2,y_baxie2 = (cx9+cx5)//2,(cy9+cy5)//2
            img = cv2ImgAddText(img, "八邪穴2", x_baxie2,y_baxie2, (0,0,0), 20)
            cv.circle(img, (x_baxie2, y_baxie2), 10, (255, 0, 255), cv.FILLED)
            cx10 ,cy10 =  lmList[10][1],lmList[10][2]
            img = cv2ImgAddText(img, "中魁穴", cx10,cy10, (0,0,0), 20)
            cv.circle(img, (cx10, cy10), 10, (255, 0, 255), cv.FILLED)
            cx12 ,cy12 =  lmList[12][1],lmList[12][2]
            img = cv2ImgAddText(img, "十宣穴3", cx12,cy12, (0,0,0), 20)
            cv.circle(img, (cx12, cy12), 10, (255, 0, 255), cv.FILLED)
            cx13 ,cy13 =  lmList[13][1],lmList[13][2]
            x_baxie3,y_baxie3 = (cx9+cx13)//2,(cy9+cy13)//2
            img = cv2ImgAddText(img, "八邪穴3", x_baxie3,y_baxie3, (0,0,0), 20)
            cv.circle(img, (x_baxie3, y_baxie3), 10, (255, 0, 255), cv.FILLED)
            x_yaotong2,y_yaotong2 = (cx0+cx13)//2,(cy0+cy13)//2
            img = cv2ImgAddText(img, "腰痛点2", x_yaotong2,y_yaotong2, (0,0,0), 20)
            cv.circle(img, (x_yaotong2, y_yaotong2), 10, (255, 0, 255), cv.FILLED)
            cx16,cy16 =  lmList[16][1],lmList[16][2]
            img = cv2ImgAddText(img, "十宣穴4", cx16,cy16, (0,0,0), 20)
            cv.circle(img, (cx16, cy16), 10, (255, 0, 255), cv.FILLED)
            cx17,cy17 =  lmList[17][1],lmList[17][2]
            img = cv2ImgAddText(img, "后溪穴", cx17,cy17, (0,0,0), 20)
            cv.circle(img, (cx17, cy17), 10, (255, 0, 255), cv.FILLED)
            x_baxie4,y_baxie4 = (cx13+cx17)//2,(cy13+cy17)//2
            img = cv2ImgAddText(img, "八邪穴4", x_baxie4,y_baxie4, (0,0,0), 20)
            cv.circle(img, (x_baxie4, y_baxie4), 10, (255, 0, 255), cv.FILLED)
            cx18,cy18 =  lmList[18][1],lmList[18][2]
            img = cv2ImgAddText(img, "小骨空穴", cx18,cy18, (0,0,0), 20)
            cv.circle(img, (cx18, cy18), 10, (255, 0, 255), cv.FILLED)
            cx20,cy20 =  lmList[20][1],lmList[20][2]
            img = cv2ImgAddText(img, "十宣穴5", cx20,cy20, (0,0,0), 20)
            cv.circle(img, (cx20, cy20), 10, (255, 0, 255), cv.FILLED)
            cv.imwrite(r'C:\Users\13267\Desktop\test\hands2.jpg',img)#标记后的图片存储位置
    
    print(lmList)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228

    标记涉及的穴位介绍如下:
    手心
    鱼际穴:取穴位置在手外侧,第一掌骨桡侧中点赤白肉际处。缓解病症:1.咳嗽、咳血、喉咙干、咽喉肿痛、失声等肺部热证;2.小孩营养不良。

    少府穴:取穴位置在手掌,横平第五掌指关节近端,第四、五掌骨之间。缓解病症:1.心悸等心胸病;2.阴部发痒,阴部疼痛;3.小指痉挛。

    劳宫穴:取穴位置在掌区,横平第三掌指关节近端,第二、三掌骨之间偏于第三掌骨。缓解病症:1.中风昏迷、中暑等急症;2.心痛、烦闷、癫狂等心志疾病;3.口疮、口臭;4.手癣。

    中冲穴:取穴位置在手指,中指末端最高点。缓解病症:1.中风昏迷、不能说话、中暑等急症;2.热病、舌下肿痛。

    四缝穴:取穴位置在手背,第二至五掌面的近侧指间关节横纹的中央,一手四穴。缓解病症:1.小儿营养不良;2.百日咳。

    十宣穴:取穴位置在手指,十指尖端,距指甲游离缘0.1寸(指寸),左右共10穴。缓解病症:1.昏迷;2.癫痫;3.咽喉肿痛;4.手指麻木。

    手背:
    中泉穴:取穴位置在前臂前区,腕掌侧远端横纹上,指总伸肌腱桡侧的凹陷中。缓解病症:1.胸胁肿痛、咳嗽、气喘、心痛;2.胃脘疼痛;3.掌中热。

    大骨空穴:取穴位置在手指,拇指背面,指间关节处的中点处。缓解病症:1.眼睛疼、迎风流泪、白内障;2.吐泻;3.鼻出血。

    少商穴:取穴位置在手指,拇指末节桡侧,指甲根角侧上方0.1寸(指寸)。缓解病症:1.咽喉肿痛、鼻子出血、高热、昏迷等肺系热证;2.癫狂。

    十宣穴:取穴位置在手指,十指尖端,距指甲游离缘0.1寸(指寸),左右共10穴。缓解病症:1.昏迷;2.癫痫;3.咽喉肿痛;4.手指麻木。

    三间穴:取穴位置在手指,第二掌指关节桡侧近端凹陷中。缓解病症:1.牙疼、咽喉疼等五官病症;2.腹胀等肠道问题;3.嗜睡。

    合谷穴:取穴位置在手背,第二掌骨桡侧的中点处。缓解病症:1.头痛、牙痛、鼻子流血等头面五官病症;2.发热等感冒病症;3.闭经等妇产科病症;

    八邪穴:取穴位置在手背,第一至五指间,指蹼缘后方赤白肉际处,左右共8次。缓解病症:1.手臂肿痛、手指麻木;2.眼睛疼;3.毒蛇咬伤。

    腰痛点:取穴位置在手背第二、三掌骨间及第四、五掌骨间,腕背侧远端横纹与掌指关节的中点处,一手二穴。缓解病症:急性腰扭伤。
    中魁穴:取穴位置在手指,中指背面,近侧指间关节的中点处。缓解病症:打嗝、呕吐、食欲不振等脾胃病症。

    后溪穴:取穴位置在手内侧,第五掌指关节尺侧近端赤白肉际凹陷中。缓解病症:1.头和颈部头痛、腰背疼、手指及胳膊抽筋的疼;2.眼红、耳朵聋;3.癫狂痫;4.疟疾。

    小骨空穴:取穴位置在手指,小指背面,近侧指间关节的中点处。缓解病症:1.眼睛疼,迎风流泪,白内障;2.指关节疼。

    4 完整代码

    import cv2 as cv
    import numpy as np
    import mediapipe as mp
    import  tqdm
    import time
    import  matplotlib.pyplot as plt
    from PIL import Image, ImageDraw, ImageFont
    
    def cv2ImgAddText(img, text, left, top, textColor=(0, 255, 0), textSize=20):
        if (isinstance(img, np.ndarray)):  # 判断是否OpenCV图片类型
            img = Image.fromarray(cv.cvtColor(img, cv.COLOR_BGR2RGB))
        # 创建一个可以在给定图像上绘图的对象
        draw = ImageDraw.Draw(img)
        # 字体的格式
        fontStyle = ImageFont.truetype(
            "simsun.ttc", textSize, encoding="utf-8")
        # 绘制文本
        draw.text((left, top), text, textColor, font=fontStyle)
        # 转换回OpenCV格式
        return cv.cvtColor(np.asarray(img), cv.COLOR_RGB2BGR)
    # 手部关键点检测模型
    mp_hand=mp.solutions.hands
    
    # 导入模型
    hands=mp_hand.Hands(static_image_mode=False,
                        max_num_hands=1,
                        min_detection_confidence=0.3,
                        min_tracking_confidence=0.3
                        )
    # 导入绘图函数
    mpDraw=mp.solutions.drawing_utils
    img=cv.imread(r'C:\Users\13267\Desktop\test\hand2.jpg')
    #look_img(img)
    img_RGB=cv.cvtColor(img,cv.COLOR_BGR2RGB)
    results=hands.process(img_RGB)
    lmList = []
    
    if results.multi_hand_landmarks:
        for handLms in results.multi_hand_landmarks:
            for id, lm in enumerate(handLms.landmark):
                h, w, c = img.shape
                cx, cy = int(lm.x * w), int(lm.y * h)
                lmList.append([id, cx, cy])
                
    
    if lmList[12][2] < lmList[0][2]:
        if lmList[4][1] < lmList[20][1]:
            print('手心')
            cx0,cy0 = lmList[0][1],lmList[0][2]
            cx1 ,cy1 =  lmList[1][1],lmList[1][2]
            img = cv2ImgAddText(img, "鱼际穴", cx1, cy1, (0,0,0), 30)
            cv.circle(img, (cx1, cy1), 10, (255, 0, 255), cv.FILLED)
            cx4,cy4 = lmList[4][1],lmList[4][2]
            img = cv2ImgAddText(img, "十宣穴1", cx4, cy4, (0,0,0), 30)
            cv.circle(img, (cx4, cy4), 10, (255, 0, 255), cv.FILLED)
            cx6,cy6 = lmList[6][1],lmList[6][2]
            img = cv2ImgAddText(img, "四缝穴1", cx6, cy6, (0,0,0), 30)
            cv.circle(img, (cx6, cy6), 10, (255, 0, 255), cv.FILLED)
            cx8,cy8 = lmList[8][1],lmList[8][2]
            img = cv2ImgAddText(img, "十宣穴2", cx8, cy8, (0,0,0), 30)
            cv.circle(img, (cx8, cy8), 10, (255, 0, 255), cv.FILLED)
            cx9,cy9 = lmList[9][1],lmList[9][2]
            cv.circle(img, ((3*cx9+cx0)//4, (3*cy9+cy0)//4), 10, (255, 0, 255), cv.FILLED)
            img = cv2ImgAddText(img, "劳宫穴", (3*cx9+cx0)//4, (3*cy9+cy0)//4, (0,0,0), 30)
            x_center,y_center=(cx9+cx0)//2, (cy9+cy0)//2
            cx10,cy10 = lmList[10][1],lmList[10][2]
            img = cv2ImgAddText(img, "四缝穴2", cx10, cy10, (0,0,0), 30)
            cv.circle(img, (cx10, cy10), 10, (255, 0, 255), cv.FILLED)
            cx11 , cy11 = lmList[11][1],lmList[11][2]
            cx12 , cy12 = lmList[12][1],lmList[12][2]
            img = cv2ImgAddText(img, "十宣穴3", cx12, cy12, (0,0,0), 30)
            cv.circle(img, (cx12, cy12), 10, (255, 0, 255), cv.FILLED)
            img = cv2ImgAddText(img, "中冲穴", (2*cx12+cx11)//3, (2*cy12+cy11)//3, (0,0,0), 30)
            cv.circle(img, ((2*cx12+cx11)//3, (2*cy12+cy11)//3), 10, (255, 0, 255), cv.FILLED)
            cx14,cy14 = lmList[14][1],lmList[14][2]
            img = cv2ImgAddText(img, "四缝穴3", cx14, cy14, (0,0,0), 30)
            cv.circle(img, (cx14, cy14), 10, (255, 0, 255), cv.FILLED)
            cx16,cy16 = lmList[16][1],lmList[16][2]
            img = cv2ImgAddText(img, "十宣穴4", cx16, cy16, (0,0,0), 30)
            cv.circle(img, (cx16, cy16), 10, (255, 0, 255), cv.FILLED)
            cx17,cy17 = lmList[17][1],lmList[17][2]
            img = cv2ImgAddText(img, "少府穴", (3*cx17+cx0)//4, (3*cy17+cy0)//4, (0,0,0), 30)
            cv.circle(img, ((3*cx17+cx0)//4, (3*cy17+cy0)//4), 10, (255, 0, 255), cv.FILLED)
            cx18,cy18 = lmList[18][1],lmList[18][2]
            img = cv2ImgAddText(img, "四缝穴4", cx18, cy18, (0,0,0), 30)
            cv.circle(img, (cx18, cy18), 10, (255, 0, 255), cv.FILLED)
            cx20,cy20 = lmList[20][1],lmList[20][2]
            img = cv2ImgAddText(img, "十宣穴5", cx20, cy20, (0,0,0), 30)
            cv.circle(img, (cx20, cy20), 10, (255, 0, 255), cv.FILLED)
            cv.imwrite(r'C:\Users\13267\Desktop\test\hands2.jpg',img)
        else:
            print('手背')
            cx0,cy0 = lmList[0][1],lmList[0][2]
            cx1,cy1 = lmList[1][1],lmList[1][2]
            x_zhongquan,y_zhongquan = (3*cx0+cx1)//4,(3*cy0+cy1)//4
            img = cv2ImgAddText(img, "中泉穴", x_zhongquan,y_zhongquan, (0,0,0), 20)
            cv.circle(img, (x_zhongquan, y_zhongquan), 10, (255, 0, 255), cv.FILLED)
            cx2 ,cy2 =  lmList[2][1],lmList[2][2]
            cx3 ,cy3 =  lmList[3][1],lmList[3][2]
            img = cv2ImgAddText(img, "大骨空穴", cx3,cy3, (0,0,0), 20)
            cv.circle(img, (cx3, cy3), 10, (255, 0, 255), cv.FILLED)
            cx4,cy4 = lmList[4][1],lmList[4][2]
            x_shaoshang,y_shaoshang = (cx3+cx4)//2,(cy3+cy4)//2
            img = cv2ImgAddText(img, "少商穴", x_shaoshang,y_shaoshang, (0,0,0), 20)
            cv.circle(img, (x_shaoshang, y_shaoshang), 10, (255, 0, 255), cv.FILLED)
            img = cv2ImgAddText(img, "十宣穴1", cx4,cy4, (0,0,0), 20)
            cv.circle(img, (cx4, cy4), 10, (255, 0, 255), cv.FILLED)
            cx5,cy5 = lmList[5][1],lmList[5][2]
            x_053,y_053 = (3*cx5+cx0)//4,(3*cy5+cy0)//4
            x_05,y_05 = (cx5+cx0)//2,(cy5+cy0)//2
            x_sanjian,y_sanjian = (x_053+cx2)//2,(y_053+cy2)//2
            x_hegu,y_hegu = (x_05+cx2)//2,(y_05+cy2)//2
            img = cv2ImgAddText(img, "三间穴", x_sanjian,y_sanjian, (0,0,0), 20)
            cv.circle(img, (x_sanjian, y_sanjian), 10, (255, 0, 255), cv.FILLED)
            img = cv2ImgAddText(img, "合谷穴", x_hegu,y_hegu, (0,0,0), 20)
            cv.circle(img, (x_hegu, y_hegu), 10, (255, 0, 255), cv.FILLED)
            x_baxie1,y_baxie1 = (cx2+cx5)//2,(cy2+cy5)//2
            img = cv2ImgAddText(img, "八邪穴1", x_baxie1,y_baxie1, (0,0,0), 20)
            cv.circle(img, (x_baxie1, y_baxie1), 10, (255, 0, 255), cv.FILLED)
            x_yaotong1,y_yaotong1=(cx5+cx0)//2,(cy5+cy0)//2
            img = cv2ImgAddText(img, "腰痛点1", x_yaotong1,y_yaotong1, (0,0,0), 20)
            cv.circle(img, (x_yaotong1, y_yaotong1), 10, (255, 0, 255), cv.FILLED)
            cx8,cy8 = lmList[8][1],lmList[8][2]
            img = cv2ImgAddText(img, "十宣穴2", cx8,cy8, (0,0,0), 20)
            cv.circle(img, (cx8, cy8), 10, (255, 0, 255), cv.FILLED)
            cx9 ,cy9 =  lmList[9][1],lmList[9][2]
            x_baxie2,y_baxie2 = (cx9+cx5)//2,(cy9+cy5)//2
            img = cv2ImgAddText(img, "八邪穴2", x_baxie2,y_baxie2, (0,0,0), 20)
            cv.circle(img, (x_baxie2, y_baxie2), 10, (255, 0, 255), cv.FILLED)
            cx10 ,cy10 =  lmList[10][1],lmList[10][2]
            img = cv2ImgAddText(img, "中魁穴", cx10,cy10, (0,0,0), 20)
            cv.circle(img, (cx10, cy10), 10, (255, 0, 255), cv.FILLED)
            cx12 ,cy12 =  lmList[12][1],lmList[12][2]
            img = cv2ImgAddText(img, "十宣穴3", cx12,cy12, (0,0,0), 20)
            cv.circle(img, (cx12, cy12), 10, (255, 0, 255), cv.FILLED)
            cx13 ,cy13 =  lmList[13][1],lmList[13][2]
            x_baxie3,y_baxie3 = (cx9+cx13)//2,(cy9+cy13)//2
            img = cv2ImgAddText(img, "八邪穴3", x_baxie3,y_baxie3, (0,0,0), 20)
            cv.circle(img, (x_baxie3, y_baxie3), 10, (255, 0, 255), cv.FILLED)
            x_yaotong2,y_yaotong2 = (cx0+cx13)//2,(cy0+cy13)//2
            img = cv2ImgAddText(img, "腰痛点2", x_yaotong2,y_yaotong2, (0,0,0), 20)
            cv.circle(img, (x_yaotong2, y_yaotong2), 10, (255, 0, 255), cv.FILLED)
            cx16,cy16 =  lmList[16][1],lmList[16][2]
            img = cv2ImgAddText(img, "十宣穴4", cx16,cy16, (0,0,0), 20)
            cv.circle(img, (cx16, cy16), 10, (255, 0, 255), cv.FILLED)
            cx17,cy17 =  lmList[17][1],lmList[17][2]
            img = cv2ImgAddText(img, "后溪穴", cx17,cy17, (0,0,0), 20)
            cv.circle(img, (cx17, cy17), 10, (255, 0, 255), cv.FILLED)
            x_baxie4,y_baxie4 = (cx13+cx17)//2,(cy13+cy17)//2
            img = cv2ImgAddText(img, "八邪穴4", x_baxie4,y_baxie4, (0,0,0), 20)
            cv.circle(img, (x_baxie4, y_baxie4), 10, (255, 0, 255), cv.FILLED)
            cx18,cy18 =  lmList[18][1],lmList[18][2]
            img = cv2ImgAddText(img, "小骨空穴", cx18,cy18, (0,0,0), 20)
            cv.circle(img, (cx18, cy18), 10, (255, 0, 255), cv.FILLED)
            cx20,cy20 =  lmList[20][1],lmList[20][2]
            img = cv2ImgAddText(img, "十宣穴5", cx20,cy20, (0,0,0), 20)
            cv.circle(img, (cx20, cy20), 10, (255, 0, 255), cv.FILLED)
            cv.imwrite(r'C:\Users\13267\Desktop\test\hands2.jpg',img)
    else:
        if lmList[4][1] > lmList[20][1]:
            print('手心')
            cx0,cy0 = lmList[0][1],lmList[0][2]
            cx1 ,cy1 =  lmList[1][1],lmList[1][2]
            img = cv2ImgAddText(img, "鱼际穴", cx1, cy1, (0,0,0), 30)
            cv.circle(img, (cx1, cy1), 10, (255, 0, 255), cv.FILLED)
            cx4,cy4 = lmList[4][1],lmList[4][2]
            img = cv2ImgAddText(img, "十宣穴1", cx4, cy4, (0,0,0), 30)
            cv.circle(img, (cx4, cy4), 10, (255, 0, 255), cv.FILLED)
            cx6,cy6 = lmList[6][1],lmList[6][2]
            img = cv2ImgAddText(img, "四缝穴1", cx6, cy6, (0,0,0), 30)
            cv.circle(img, (cx6, cy6), 10, (255, 0, 255), cv.FILLED)
            cx8,cy8 = lmList[8][1],lmList[8][2]
            img = cv2ImgAddText(img, "十宣穴2", cx8, cy8, (0,0,0), 30)
            cv.circle(img, (cx8, cy8), 10, (255, 0, 255), cv.FILLED)
            cx9,cy9 = lmList[9][1],lmList[9][2]
            cv.circle(img, ((3*cx9+cx0)//4, (3*cy9+cy0)//4), 10, (255, 0, 255), cv.FILLED)
            img = cv2ImgAddText(img, "劳宫穴", (3*cx9+cx0)//4, (3*cy9+cy0)//4, (0,0,0), 30)
            x_center,y_center=(cx9+cx0)//2, (cy9+cy0)//2
            cx10,cy10 = lmList[10][1],lmList[10][2]
            img = cv2ImgAddText(img, "四缝穴2", cx10, cy10, (0,0,0), 30)
            cv.circle(img, (cx10, cy10), 10, (255, 0, 255), cv.FILLED)
            cx11 , cy11 = lmList[11][1],lmList[11][2]
            cx12 , cy12 = lmList[12][1],lmList[12][2]
            img = cv2ImgAddText(img, "十宣穴3", cx12, cy12, (0,0,0), 30)
            cv.circle(img, (cx12, cy12), 10, (255, 0, 255), cv.FILLED)
            img = cv2ImgAddText(img, "中冲穴", (2*cx12+cx11)//3, (2*cy12+cy11)//3, (0,0,0), 30)
            cv.circle(img, ((2*cx12+cx11)//3, (2*cy12+cy11)//3), 10, (255, 0, 255), cv.FILLED)
            cx14,cy14 = lmList[14][1],lmList[14][2]
            img = cv2ImgAddText(img, "四缝穴3", cx14, cy14, (0,0,0), 30)
            cv.circle(img, (cx14, cy14), 10, (255, 0, 255), cv.FILLED)
            cx16,cy16 = lmList[16][1],lmList[16][2]
            img = cv2ImgAddText(img, "十宣穴4", cx16, cy16, (0,0,0), 30)
            cv.circle(img, (cx16, cy16), 10, (255, 0, 255), cv.FILLED)
            cx17,cy17 = lmList[17][1],lmList[17][2]
            img = cv2ImgAddText(img, "少府穴", (3*cx17+cx0)//4, (3*cy17+cy0)//4, (0,0,0), 30)
            cv.circle(img, ((3*cx17+cx0)//4, (3*cy17+cy0)//4), 10, (255, 0, 255), cv.FILLED)
            cx18,cy18 = lmList[18][1],lmList[18][2]
            img = cv2ImgAddText(img, "四缝穴4", cx18, cy18, (0,0,0), 30)
            cv.circle(img, (cx18, cy18), 10, (255, 0, 255), cv.FILLED)
            cx20,cy20 = lmList[20][1],lmList[20][2]
            img = cv2ImgAddText(img, "十宣穴5", cx20, cy20, (0,0,0), 30)
            cv.circle(img, (cx20, cy20), 10, (255, 0, 255), cv.FILLED)
            cv.imwrite(r'C:\Users\13267\Desktop\test\hands2.jpg',img)
        else:
            print('手背')
            cx0,cy0 = lmList[0][1],lmList[0][2]
            cx1,cy1 = lmList[1][1],lmList[1][2]
            x_zhongquan,y_zhongquan = (3*cx0+cx1)//4,(3*cy0+cy1)//4
            img = cv2ImgAddText(img, "中泉穴", x_zhongquan,y_zhongquan, (0,0,0), 20)
            cv.circle(img, (x_zhongquan, y_zhongquan), 10, (255, 0, 255), cv.FILLED)
            cx2 ,cy2 =  lmList[2][1],lmList[2][2]
            cx3 ,cy3 =  lmList[3][1],lmList[3][2]
            img = cv2ImgAddText(img, "大骨空穴", cx3,cy3, (0,0,0), 20)
            cv.circle(img, (cx3, cy3), 10, (255, 0, 255), cv.FILLED)
            cx4,cy4 = lmList[4][1],lmList[4][2]
            x_shaoshang,y_shaoshang = (cx3+cx4)//2,(cy3+cy4)//2
            img = cv2ImgAddText(img, "少商穴", x_shaoshang,y_shaoshang, (0,0,0), 20)
            cv.circle(img, (x_shaoshang, y_shaoshang), 10, (255, 0, 255), cv.FILLED)
            img = cv2ImgAddText(img, "十宣穴1", cx4,cy4, (0,0,0), 20)
            cv.circle(img, (cx4, cy4), 10, (255, 0, 255), cv.FILLED)
            cx5,cy5 = lmList[5][1],lmList[5][2]
            x_053,y_053 = (3*cx5+cx0)//4,(3*cy5+cy0)//4
            x_05,y_05 = (cx5+cx0)//2,(cy5+cy0)//2
            x_sanjian,y_sanjian = (x_053+cx2)//2,(y_053+cy2)//2
            x_hegu,y_hegu = (x_05+cx2)//2,(y_05+cy2)//2
            img = cv2ImgAddText(img, "三间穴", x_sanjian,y_sanjian, (0,0,0), 20)
            cv.circle(img, (x_sanjian, y_sanjian), 10, (255, 0, 255), cv.FILLED)
            img = cv2ImgAddText(img, "合谷穴", x_hegu,y_hegu, (0,0,0), 20)
            cv.circle(img, (x_hegu, y_hegu), 10, (255, 0, 255), cv.FILLED)
            x_baxie1,y_baxie1 = (cx2+cx5)//2,(cy2+cy5)//2
            img = cv2ImgAddText(img, "八邪穴1", x_baxie1,y_baxie1, (0,0,0), 20)
            cv.circle(img, (x_baxie1, y_baxie1), 10, (255, 0, 255), cv.FILLED)
            x_yaotong1,y_yaotong1=(cx5+cx0)//2,(cy5+cy0)//2
            img = cv2ImgAddText(img, "腰痛点1", x_yaotong1,y_yaotong1, (0,0,0), 20)
            cv.circle(img, (x_yaotong1, y_yaotong1), 10, (255, 0, 255), cv.FILLED)
            cx8,cy8 = lmList[8][1],lmList[8][2]
            img = cv2ImgAddText(img, "十宣穴2", cx8,cy8, (0,0,0), 20)
            cv.circle(img, (cx8, cy8), 10, (255, 0, 255), cv.FILLED)
            cx9 ,cy9 =  lmList[9][1],lmList[9][2]
            x_baxie2,y_baxie2 = (cx9+cx5)//2,(cy9+cy5)//2
            img = cv2ImgAddText(img, "八邪穴2", x_baxie2,y_baxie2, (0,0,0), 20)
            cv.circle(img, (x_baxie2, y_baxie2), 10, (255, 0, 255), cv.FILLED)
            cx10 ,cy10 =  lmList[10][1],lmList[10][2]
            img = cv2ImgAddText(img, "中魁穴", cx10,cy10, (0,0,0), 20)
            cv.circle(img, (cx10, cy10), 10, (255, 0, 255), cv.FILLED)
            cx12 ,cy12 =  lmList[12][1],lmList[12][2]
            img = cv2ImgAddText(img, "十宣穴3", cx12,cy12, (0,0,0), 20)
            cv.circle(img, (cx12, cy12), 10, (255, 0, 255), cv.FILLED)
            cx13 ,cy13 =  lmList[13][1],lmList[13][2]
            x_baxie3,y_baxie3 = (cx9+cx13)//2,(cy9+cy13)//2
            img = cv2ImgAddText(img, "八邪穴3", x_baxie3,y_baxie3, (0,0,0), 20)
            cv.circle(img, (x_baxie3, y_baxie3), 10, (255, 0, 255), cv.FILLED)
            x_yaotong2,y_yaotong2 = (cx0+cx13)//2,(cy0+cy13)//2
            img = cv2ImgAddText(img, "腰痛点2", x_yaotong2,y_yaotong2, (0,0,0), 20)
            cv.circle(img, (x_yaotong2, y_yaotong2), 10, (255, 0, 255), cv.FILLED)
            cx16,cy16 =  lmList[16][1],lmList[16][2]
            img = cv2ImgAddText(img, "十宣穴4", cx16,cy16, (0,0,0), 20)
            cv.circle(img, (cx16, cy16), 10, (255, 0, 255), cv.FILLED)
            cx17,cy17 =  lmList[17][1],lmList[17][2]
            img = cv2ImgAddText(img, "后溪穴", cx17,cy17, (0,0,0), 20)
            cv.circle(img, (cx17, cy17), 10, (255, 0, 255), cv.FILLED)
            x_baxie4,y_baxie4 = (cx13+cx17)//2,(cy13+cy17)//2
            img = cv2ImgAddText(img, "八邪穴4", x_baxie4,y_baxie4, (0,0,0), 20)
            cv.circle(img, (x_baxie4, y_baxie4), 10, (255, 0, 255), cv.FILLED)
            cx18,cy18 =  lmList[18][1],lmList[18][2]
            img = cv2ImgAddText(img, "小骨空穴", cx18,cy18, (0,0,0), 20)
            cv.circle(img, (cx18, cy18), 10, (255, 0, 255), cv.FILLED)
            cx20,cy20 =  lmList[20][1],lmList[20][2]
            img = cv2ImgAddText(img, "十宣穴5", cx20,cy20, (0,0,0), 20)
            cv.circle(img, (cx20, cy20), 10, (255, 0, 255), cv.FILLED)
            cv.imwrite(r'C:\Users\13267\Desktop\test\hands2.jpg',img)
    
    print(lmList)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
    • 253
    • 254
    • 255
    • 256
    • 257
    • 258
    • 259
    • 260
    • 261
    • 262
    • 263
    • 264
    • 265
    • 266
    • 267
    • 268
    • 269
    • 270
    • 271
    • 272
    • 273

    5 实验结果展示

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

  • 相关阅读:
    5.1EF Core原理
    AVL树和红黑树
    【C++】构造函数和析构函数
    如何将动态页面静态化——模板文件(输出到一个文件里面)
    [附源码]JAVA毕业设计考研驿站网站(系统+LW)
    企业级的商用远程控制软件有哪些
    星淘惠跨境——亚马逊新消息,多地中欧班列开行,为跨境电商发展助力
    LC-220. 存在重复元素 III(滑动窗口+二分,桶排序)
    C++开发学习笔记3
    Python编程 字符串介绍以及切片
  • 原文地址:https://blog.csdn.net/weixin_46043195/article/details/126430563