我最近在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()
目前没有回答
相关问题 更多 >
编程相关推荐