如何计算摄影机在Opencv中看到的连接

2024-05-13 01:39:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近在opencv中启动了一个自己的项目。opencv中的二头肌计数器计算关节(手腕、肘部、肩部),但即使关节不在摄影机视觉中,它也会计算。我在谷歌上搜索了几个小时,但什么也没有。有人知道怎么做吗?请让我知道

问题=计算不在摄影机视觉中的连接

代码:

import cv2
import mediapipe as mp
import numpy as np
mp_drawing = mp.solutions.drawing_utils
mp_pose = mp.solutions.pose



def vidcam():

    cap = cv2.VideoCapture(0)
    titel = 'Biceps Counter' # Titel of app
    counter = 0
    stage = None

    ## setup mediapipe instance
    with mp_pose.Pose(min_detection_confidence=0.5, min_tracking_confidence=0.5) as pose:

        while cap.isOpened():
            ret, frame = cap.read()

            # Recolor image to RGB
            image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            image.flags.writeable = False

            #make detection
            results = pose.process(image)

            # Recolor back to BGR
            image.flags.writeable = True
            image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
            
            # Extract landmarks
            # here try: except:

            

            try:
                landmarks = results.pose_landmarks.landmark
            


                # Get coordinates
                shoulder = [landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].x, landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].y]
                elbow = [landmarks[mp_pose.PoseLandmark.LEFT_ELBOW.value].x, landmarks[mp_pose.PoseLandmark.LEFT_ELBOW.value].y]
                wrist = [landmarks[mp_pose.PoseLandmark.LEFT_WRIST.value].x, landmarks[mp_pose.PoseLandmark.LEFT_WRIST.value].y]
                

                # Test here

                if landmarks[mp_pose.PoseLandmark.LEFT_WRIST.value].x in results:
                    print("Cant find point")
                else:
                    print("find it")

                # end test


                # Calculate Angle
                angle = calculate_angle(shoulder, elbow, wrist)

                
                # Visualize Angle
                cv2.putText(image, str(angle),
                            tuple(np.multiply(elbow, [640, 480]).astype(int)),
                            cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2, cv2.LINE_AA
                        )
                
                
                
                # movement counter
                if angle > 150:
                    stage = 'down'
                if angle < 50 and stage == 'down':
                    stage = 'up'
                    counter +=1
                    print(counter)

            except:
                print("Something when wrong... Try again if not working contact support")


            # Box for Counter
            cv2.rectangle(image, (40,40), (100,100), (0,0,0), -1)
            
            # Display Counter
            cv2.putText(image, 'Bicep Counter', (20,20),
                            cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0,0,0), 1, cv2.LINE_AA)
            
            cv2.putText(image, str(counter), (65,75),
                            cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255,255,255), 2, cv2.LINE_AA)
            
            
            # Rendering Detections
            mp_drawing.draw_landmarks(image, results.pose_landmarks, mp_pose.POSE_CONNECTIONS,
                                    mp_drawing.DrawingSpec(color=(245, 66, 66), thickness=2, circle_radius=2), # Line Blue
                                    mp_drawing.DrawingSpec(color=(245, 66, 230), thickness=2, circle_radius=2), # Joints Pink
                                    )


            cv2.imshow(titel, image)

            
            
            pressedKey = cv2.waitKey(1) & 0xFF
            if pressedKey == ord('q'):
                print("q is pressed")
                break

        close()


def calculate_angle(a,b,c):

    a = np.array(a) # First   -> example joint 1 SHOULDER
    b = np.array(b) # Second   -> example joint 2 ELBOW
    c = np.array(c) # Last   -> example joint 3 WRIST
    

    # (value c[y] - b[y]), (value c[x] - b[x])
    radians = np.arctan2(c[1]-b[1], c[0]-b[0]) - np.arctan2(a[1]-b[1], a[0]-b[0])
    angle = np.abs(radians * 180.0/np.pi)
    
    
    if angle > 180.0:    # Max 180° degree
        angle = 360 - angle
    
    return angle

def close():
    cap = cv2.VideoCapture(0)
    cap.release()
    cv2.destroyAllWindows()

在另一个文件中,我像这样调用vidcam函数

vidcam()

Tags: imageifvaluenpcountermpcv2left