1

I'm making a Python script to save the landmarks obtained when using mediapipe. I want to save only the landmarks but I don't want to save the rest of the frame content. Is this possible?

My first idea was to create a black image and put on top of it the landmarks that are obtained when processing the frame that has a person, and when I show it with cv2.imshow(img) I get the landmarks but when I want to save the video I only see black frames. Can anyone help me, I leave below the function that I have done.

import cv2
import numpy as np
import mediapipe as mp
from mediapipe.python.solutions.face_mesh_connections import FACEMESH_CONTOURS

mp_drawing = mp.solutions.drawing_utils 
mp_holistic = mp.solutions.holistic 



def extract_bones(video_path, new_video_path):
    # Captura de los videos
    #cap = cv2.VideoCapture(video_path)
    cap = cv2.VideoCapture(video_path)
    # Se toma el ancho y alto del video
    width  = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    # Se crea el formato del nuevo video.
    output = cv2.VideoWriter(new_video_path,cv2.VideoWriter_fourcc('M','J','P','G'), 30, (width,height))
    # Initialize holistic model
    with mp_holistic.Holistic(min_detection_confidence = 0.5, min_tracking_confidence = 0.5) as holistic:
        while cap.isOpened():
            # Read frame
            ret, frame = cap.read()
            
            if ret == True:
                img = np.zeros((frame.shape[0], frame.shape[1], frame.shape[2]))
                # Resize frame
                #frame = cv2.resize(frame, (WIDTH, HEIGHT), interpolation = cv2.INTER_AREA)
                # Change color from BGR to RGB
                frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
                frame.flags.writeable = False
                # Detect landmarks
                results = holistic.process(frame)
                # Left hand (azul)
                mp_drawing.draw_landmarks(
                    img, results.left_hand_landmarks, mp_holistic.HAND_CONNECTIONS,
                    mp_drawing.DrawingSpec(color=(255, 255, 0), thickness=2, circle_radius=1),
                    mp_drawing.DrawingSpec(color=(255, 0, 0), thickness=2))
                print(img)
              

                # Right hand (verde)
                mp_drawing.draw_landmarks(
                    img, results.right_hand_landmarks, mp_holistic.HAND_CONNECTIONS,
                    mp_drawing.DrawingSpec(color=(0, 255, 0), thickness=2, circle_radius=1),
                    mp_drawing.DrawingSpec(color=(57, 143, 0), thickness=2))
                print(img)

                # Pose
                mp_drawing.draw_landmarks(
                    img, results.pose_landmarks, mp_holistic.POSE_CONNECTIONS,
                    mp_drawing.DrawingSpec(color=(128, 0, 255), thickness=2, circle_radius=1),
                    mp_drawing.DrawingSpec(color=(255, 255, 255), thickness=2))
                print(img)
        
                
                frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
                cv2.imshow("Frame", frame)
                cv2.imshow("Black", img)
                output.write(img)
                if cv2.waitKey(1) & 0xFF == ord('q'):
                        break
            else:
                break
    cap.release()

Thank you very much

Talha Tayyab
  • 8,111
  • 25
  • 27
  • 44
Matanuces
  • 11
  • 3

2 Answers2

0

After plotting the landmarks on the black image, try saving the image using pillow:

from PIL import Image

im = Image.fromarray(frame)
im.save("output.jpeg")
S.B
  • 13,077
  • 10
  • 22
  • 49
Samdon
  • 1
  • 1
0

Try putting output.release() at the end.

I am not sure if it will solve the problem but it is a good practice either way.

Jerry_V
  • 61
  • 6