文章目录
- 1 简要介绍
- 2 技术详情
- 3 代码实现
- 3.1 导入相应的库
- 3.2 定义在图片中画点写字的函数
- 3.3 定义手部关键点监测模型并导入
- 3.4 导入绘图函数
- 3.5 将原本三维的坐标系转为2维方便平面坐标计算
- 3.6 计算手部穴位的函数
- 4 完整代码
- 5 实验结果展示
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
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)
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
)
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 = []
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])
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.小孩营养不良。
少府穴:取穴位置在手掌,横平第五掌指关节近端,第四、五掌骨之间。缓解病症: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)
5 实验结果展示