PC端Opencv手部关节校验与HMS Core ML Kit 机器学习套件尝试(Android端)

Opencv 官网下载链接: https://opencv.org/releases/

一、 效果(版本2的效果)

手部模型不需要自己再去训练,Opencv封装好了训练模型。
封装好的文件模型如下(记得当时是找了很久才找到在哪里,所以当时找到了专门建了一个文件夹):

在这里插入图片描述
我自己的Opencv是4.x版本的,这些xml文件具体在:
D:\Opencv\opencv\sources\data\haarcascades_cuda
可以使用文件搜索:
在这里插入图片描述

如果找不到下面有链接。
百度网盘连接提取码:2apc

在这里插入图片描述
下面是我的关于Opencv的手势识别代码模型。

二、全部源码

版本1:未封装代码

这个代码可以复制后直接运行,看出效果的。


#!/usr/bin/python3.7
# coding=utf-8
import cv2
import mediapipe as mp
import time
# 导入opencv模块
# 捕捉帧,笔记本摄像头设置为0即可
""" VideoCapture第一个参数就是摄像头编号"""
capture =cv2.VideoCapture(0,cv2.CAP_DSHOW)
# 初始化(模型使用之前)
mpHands =mp.solutions.hands
hands=mpHands.Hands()
mpDraw=mp.solutions.drawing_utils
pTime=0
cTime=0
# 循环显示帧
while True :
    success, img = capture.read()
    imgRGB=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    results=hands.process(imgRGB)
    """在显示图片之前,我们需要对图像进行一些处理"""
    # 下面这个函数,当手放入摄像头范围内,就会返回相应的Landmark值,否则返回的是None
    #print(results.multi_hand_landmarks)
    # 输出手的每个坐标(一只手几十个点)
    if results.multi_hand_landmarks:
     print("读取成功!")
     for handLms in results.multi_hand_landmarks:
         for id, lm in enumerate(handLms.landmark):
             print(id,lm)
         mpDraw.draw_landmarks(img, handLms,mpHands.HAND_CONNECTIONS) # 第三个参数的意思是,让手中的节点连接。
    cv2.imshow('Carmer', img)
    if cv2.waitKey(1) == ord('q'):  # 按Q退出
     break


版本2:封装好的代码

这个代码是封装好的,都后面如果需要就是直接引用。不过也可以直接运行这个程序,也同样能出结果。

import cv2
import mediapipe as mp
import time


class handDetector():
    def __init__(self, mode=False, maxHands=2, detectionCon=0.5, trackCon=0.5):
        self.mode = mode
        self.maxHands = maxHands
        self.detectionCon = detectionCon
        self.trackCon = trackCon

        self.mpHands = mp.solutions.hands
        self.hands = self.mpHands.Hands(self.mode, self.maxHands,
                                        self.detectionCon, self.trackCon)
        self.mpDraw = mp.solutions.drawing_utils

    def findHands(self, img, draw=True):
        imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        self.results = self.hands.process(imgRGB)
        # print(results.multi_hand_landmarks)
        if self.results.multi_hand_landmarks:
            for handLms in self.results.multi_hand_landmarks:
                if draw:
                    self.mpDraw.draw_landmarks(img, handLms,
                                               self.mpHands.HAND_CONNECTIONS)
        return img

    def findPosition(self, img, handNo=0, draw=True):

        lmList = []
        if self.results.multi_hand_landmarks:
            myHand = self.results.multi_hand_landmarks[handNo]
            for id, lm in enumerate(myHand.landmark):
                # print(id, lm)
                h, w, c = img.shape
                cx, cy = int(lm.x * w), int(lm.y * h)
                # print(id, cx, cy)
                lmList.append([id, cx, cy])
                # if draw:   这部分代码画出了手上所有结点,因为比较难看,就注释掉了。
                #     cv2.circle(img, (cx, cy), 15, (255, 0, 255), cv2.FILLED)

        return lmList


def main():
    pTime = 0
    cTime = 0
    cap = cv2.VideoCapture(0)
    detector = handDetector()
    while True:
        success, img = cap.read()
        img = detector.findHands(img)
        lmList = detector.findPosition(img)
        if len(lmList) != 0:
            print(lmList[4])

        cTime = time.time()
        fps = 1 / (cTime - pTime)
        pTime = cTime

        cv2.putText(img, str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3,
                    (255, 0, 255), 3)

        cv2.imshow("Image", img)
        cv2.waitKey(1)

if __name__ == "__main__":
    main()

同时打印出了手上的每个结点的位置变化。
**加粗样式**

三、 开发工具

Pycharm2021,Python3.7 .

四、 遇到的问题记录

1. error: (-215:Assertion failed) !_src.empty() in function ‘cv::cvtColor’

报错:

imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

cv2.error: OpenCV(4.5.3) C:\Users\runneradmin\AppData\Local\Temp\pip-req-build-_xlv4eex\opencv\modules\imgproc\src\color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function ‘cv::cvtColor’

这个问题,网上的一些解释是,如果你导入的是一个静态图片,那么要么是你的斜杠写错,
或者是你的路径中有中文,不妨换个没有中文的路径,或者修改图片为英文试试。

但是我这里是摄像头

解决方案:修改摄像头参数

    cap = cv2.VideoCapture(1)	#这个是B站源码中的摄像头编号

可能是获取摄像头参数出错,修改摄像头编号为0。运行即可。

    cap = cv2.VideoCapture(0)	

2. 使用pip指令,下载opencv-python,numpy等报错

在控制台上使用pip指令下载是,经常碰到超时问题,本身文件不大,但是你的下载速度只有12kb/s甚至只有几kb每秒
遇到的问题例如下面这个:
在这里插入图片描述
其实这个问题就是因为你的下载速度太慢导致的。

解决方案:使用国内镜像安装
这时候,考虑使用国内镜像安装,会快很多。.点击进入国内镜像安装教程
一般numpy,opencv-python都有国内镜像。不过我安装mediatepipe时,并没有找到国内镜像,但是控制台cmd使用下面这个指令太慢了。也是只有几kb/s

pip install mediapipe

所以我选择了去PyCharm去下载:
方式:
File—>Setting—>Project:python-project-Python Interpreter(Python解释器)
在这里插入图片描述

在这里插入图片描述
点击“+”,添加解释器,然后在搜索框中搜索你需要的package即可。opencv-python,numpy,mediapipe都可以直接搜到。
在这里插入图片描述
点击下面的Install Package即可。

3.`anonymous-namespace’::SourceReaderCB::~SourceReaderCB terminating async callback

ValueError: could not broadcast input array from shape (656,396,3) into shape (200,200,3)
[ WARN:1] global C:\Users\runneradmin\AppData\Local\Temp\pip-req-build-_xlv4eex\opencv\modules\videoio\src\cap_msmf.cpp (438) `anonymous-namespace’::SourceReaderCB::~SourceReaderCB terminating async callback

               
原代码:

cap =cv2.VideoCapture(0)

修改成下面的:

cap =cv2.VideoCapture(0,cv2.CAP_DSHOW)

五、附录:关于Android中使用机器学习套件

现在做的项目需要把OpenCV部署到 Android 端,其实Opencv有专门为Android设计的函数库,但是上手慢,安装比较复杂。这里推荐用华为HMS Core 中的 机器学习服务

HMS Core是华为终端云服务(HUAWEI Mobile Services)开放能力合集,位于开发者应用与操作系统之间,是为应用开发提供基础服务的平台。同时,依托华为云服务,HMS Core也为这些服务提供云端能力,用于各服务的开通、业务实现及运营,如下图所示。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

具体HMS Core 服务信息点击这个链接 :HMS Core 服务官方文档

对于新手来说,上手很方便,在我的项目里面主要用于康复训练姿势识别。这里给出几个项目的运行截图

在这里插入图片描述
从开发者来讲,HMS Core ML Kit使用起来十分方便,其中还有很多姿势识别,这里只是列举了手势识别的效果。这款APP全部由我一人开发完成,时间原因只能做一些简单的姿势。

HMS Core ML Kit 机器学习套件 相关网址:

2.Gitee HMS 终端服务仓库

3.Gitee 官方机器学习套件代码

想直接看机器学习的点击第三个链接就是源代码部分。

     先根据官方文档注册成为开发者,后续使用直接下载Gitee ZIP文件,然后将下载下来的压缩包解压成文件夹,直接解压放到桌面上也行,然后用Android Studio 直接打开本地文件直接运行就可以使用了。

注意:HMS Core中的姿态识别需要在真机调试。
由于本人使用的就是华为手机(鸿蒙操作系统),所以把项目运行在我的手机上时可以直接用,但是别的牌子手机可能就需要安装 HMS Core 终端服务了。.

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Issac-Clarke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值