mirror of
https://github.com/deepinsight/insightface.git
synced 2025-12-30 16:12:27 +00:00
96 lines
3.5 KiB
Python
96 lines
3.5 KiB
Python
import click
|
|
import cv2
|
|
import inspireface as ifac
|
|
from inspireface.param import *
|
|
import numpy as np
|
|
|
|
@click.command()
|
|
@click.argument("resource_path")
|
|
@click.argument('source')
|
|
@click.option('--show', is_flag=True, help='Display the video stream or video file in a window.')
|
|
def case_face_tracker_from_video(resource_path, source, show):
|
|
"""
|
|
Launch a face tracking process from a video source. The 'source' can either be a webcam index (0, 1, ...)
|
|
or a path to a video file. Use the --show option to display the video.
|
|
|
|
Args:
|
|
resource_path (str): Path to the resource directory for face tracking algorithms.
|
|
source (str): Webcam index or path to the video file.
|
|
show (bool): If set, the video will be displayed in a window.
|
|
"""
|
|
# Initialize the face tracker or other resources.
|
|
print(f"Initializing with resources from: {resource_path}")
|
|
# Step 1: Initialize the SDK and load the algorithm resource files.
|
|
ret = ifac.launch(resource_path)
|
|
assert ret, "Launch failure. Please ensure the resource path is correct."
|
|
|
|
# Optional features, loaded during session creation based on the modules specified.
|
|
opt = HF_ENABLE_NONE
|
|
session = ifac.InspireFaceSession(opt, HF_DETECT_MODE_LIGHT_TRACK) # Use video mode
|
|
|
|
# Determine if the source is a digital webcam index or a video file path.
|
|
try:
|
|
source_index = int(source) # Try to convert source to an integer.
|
|
cap = cv2.VideoCapture(source_index)
|
|
print(f"Using webcam at index {source_index}.")
|
|
except ValueError:
|
|
# If conversion fails, treat source as a file path.
|
|
cap = cv2.VideoCapture(source)
|
|
print(f"Opening video file at {source}.")
|
|
|
|
if not cap.isOpened():
|
|
print("Error: Could not open video source.")
|
|
return
|
|
|
|
# Main loop to process video frames.
|
|
while True:
|
|
ret, frame = cap.read()
|
|
if not ret:
|
|
break # Exit loop if no more frames or error occurs.
|
|
|
|
# Process frame here (e.g., face detection/tracking).
|
|
faces = session.face_detection(frame)
|
|
for idx, face in enumerate(faces):
|
|
print(f"{'==' * 20}")
|
|
print(f"idx: {idx}")
|
|
# Print Euler angles of the face.
|
|
print(f"roll: {face.roll}, yaw: {face.yaw}, pitch: {face.pitch}")
|
|
|
|
# Get face bounding box
|
|
x1, y1, x2, y2 = face.location
|
|
|
|
# Calculate center, size, and angle
|
|
center = ((x1 + x2) / 2, (y1 + y2) / 2)
|
|
size = (x2 - x1, y2 - y1)
|
|
angle = face.roll # 这里使用 roll 角度
|
|
|
|
# Get rotation matrix
|
|
rotation_matrix = cv2.getRotationMatrix2D(center, angle, 1.0)
|
|
|
|
# Apply rotation to the bounding box corners
|
|
rect = ((center[0], center[1]), (size[0], size[1]), angle)
|
|
box = cv2.boxPoints(rect)
|
|
box = box.astype(int)
|
|
|
|
# Draw the rotated bounding box
|
|
cv2.drawContours(frame, [box], 0, (100, 180, 29), 2)
|
|
|
|
# Draw landmarks
|
|
lmk = session.get_face_dense_landmark(face)
|
|
for x, y in lmk.astype(int):
|
|
cv2.circle(frame, (x, y), 0, (220, 100, 0), 2)
|
|
|
|
if show:
|
|
cv2.imshow("Face Tracker", frame)
|
|
if cv2.waitKey(1) & 0xFF == ord('q'):
|
|
break # Exit loop if 'q' is pressed.
|
|
|
|
# Cleanup: release video capture and close any open windows.
|
|
cap.release()
|
|
cv2.destroyAllWindows()
|
|
print("Released all resources and closed windows.")
|
|
|
|
|
|
if __name__ == '__main__':
|
|
case_face_tracker_from_video()
|