Home > Net >  How to get one of the specific values(with the specific index) of this iterable enumerate (results.p
How to get one of the specific values(with the specific index) of this iterable enumerate (results.p

Time:01-01

import cv2 #OpenCV is the library that we will be using for image processing
import mediapipe as mp #Mediapipe is the framework that will allow us to get our pose estimation
import time


mpDraw = mp.solutions.drawing_utils
mpPose = mp.solutions.pose

pose = mpPose.Pose()
#pose = mpPose.Pose(static_image_mode = False, upper_body_only = True) #ONLY UPPER_BODY_TRACKING

#cap = cv2.VideoCapture(0)
cap = cv2.VideoCapture('PoseVideos/1_girl_choreography.mp4')

pTime = 0 #previous time

while True:
    success, img = cap.read() #that will give it our image and then we can write the cv2.imshow()
    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) #convert our image to RGB because Mediapipe use that format
    results = pose.process(imgRGB) #we are simply going to send this image to our model

    #print(enumerate(results.pose_landmarks.landmark)) #<enumerate object at 0x0000012312DD1A00>

    #so then we will check if it is detected or not
    if results.pose_landmarks:

        mpDraw.draw_landmarks(img, results.pose_landmarks, mpPose.POSE_CONNECTIONS) 

        for id, lm in enumerate(results.pose_landmarks.landmark):

            h, w, c = img.shape #get dimensions(h height, w width) and the c channel of image
            
            print(id)
            print(lm)

            cx, cy = int(lm.x * w), int(lm.y * h)

            cv2.circle(img, (cx, cy), 5, (255, 0, 0), cv2.FILLED)


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

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

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

I want to do what the for does but instead of doing it for all the elements (id) inside the enumerate (), do it only for the id = 25, because in this case it is the only point that interests me.

What would I need to change in this instruction of the loop that uses as iterable to this enumerate(results.pose_landmarks.landmark):

How would I enter an id[25] and a lm[25] ?

I try with itertools, but ir does work in this case

import itertools

gen = (id, lm for id, lm in enumerate(results.pose_landmarks.landmark))
specific_id, specific_lm = 25,25 #index
print( next(itertools.islice(gen, specific_id, None)) )

CodePudding user response:

Edit: You could try:

for id, lm in enumerate(results.pose_landmarks.landmark):
    if not id == 25:
        continue
    ...

Not elegant, but gets the job done.


My old answer does not apply anymore:

This looks like a duplicate to this thread. The proposed solution was itertools.islice:

>>> gen = (x for x in range(10))
>>> index = 5
>>> next(itertools.islice(gen, index, None))
5
  • Related