下载地址:https://www.pan38.com/dow/share.php?code=JCnzE 提取密码:1133
这个系统包含三个主要模块:人脸检测与特征点识别、虚拟相机实现和主程序入口。代码使用了dlib库进行人脸检测和特征点识别,可以检测眼睛位置并添加眨眼效果。虚拟相机模块可以将处理后的视频流输出到虚拟摄像头设备。
import cv2
import numpy as np
import dlib
from PIL import Image, ImageDraw
import random
import time
class FaceProcessor:
def init(self):
self.detector = dlib.get_frontal_face_detector()
self.predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
def detect_faces(self, image):
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = self.detector(gray)
return faces
def get_landmarks(self, image, face):
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
landmarks = self.predictor(gray, face)
return [(landmarks.part(i).x, landmarks.part(i).y) for i in range(68)]
def add_blink_effect(self, image, landmarks):
pil_image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
draw = ImageDraw.Draw(pil_image)
left_eye = landmarks[36:42]
right_eye = landmarks[42:48]
# Draw semi-closed eyes
for eye in [left_eye, right_eye]:
eye_top = (eye[1][0], eye[1][1] + (eye[5][1] - eye[1][1])/3)
eye_bottom = (eye[4][0], eye[4][1] - (eye[4][1] - eye[2][1])/3)
draw.line([eye_top, eye_bottom], fill=(0,0,0), width=3)
return cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR)
、、、import pyfakewebcam
import numpy as np
import time
from face_utils import FaceProcessor
class VirtualCamera:
def init(self, width=640, height=480):
self.width = width
self.height = height
self.camera = pyfakewebcam.FakeWebcam('/dev/video2', width, height)
self.processor = FaceProcessor()
self.frame_count = 0
def process_frame(self, frame):
self.frame_count += 1
faces = self.processor.detect_faces(frame)
if len(faces) > 0:
landmarks = self.processor.get_landmarks(frame, faces[0])
# Every 30 frames, add a blink effect
if self.frame_count % 30 == 0:
frame = self.processor.add_blink_effect(frame, landmarks)
return frame
def stream(self, source=0):
cap = cv2.VideoCapture(source)
while True:
ret, frame = cap.read()
if not ret:
break
frame = cv2.resize(frame, (self.width, self.height))
processed_frame = self.process_frame(frame)
# Convert BGR to RGB
rgb_frame = cv2.cvtColor(processed_frame, cv2.COLOR_BGR2RGB)
self.camera.schedule_frame(rgb_frame)
time.sleep(1/30)
cap.release()
face_utils import FaceProcessor
from virtual_camera import VirtualCamera
import cv2
import argparse
def main():
parser = argparse.ArgumentParser(description="人脸处理系统")
parser.add_argument('--image', help='处理单张图片')
parser.add_argument('--video', help='处理视频文件')
parser.add_argument('--camera', action='https://developer.aliyun.com/store_true', help='使用摄像头')
parser.add_argument('--virtual', action='https://developer.aliyun.com/store_true', help='启用虚拟摄像头')
args = parser.parse_args()
processor = FaceProcessor()
if args.image:
image = cv2.imread(args.image)
faces = processor.detect_faces(image)
if len(faces) > 0:
landmarks = processor.get_landmarks(image, faces[0])
result = processor.add_blink_effect(image, landmarks)
cv2.imshow("Result", result)
cv2.waitKey(0)
elif args.video or args.camera:
source = 0 if args.camera else args.video
cap = cv2.VideoCapture(source)
if args.virtual:
vcam = VirtualCamera()
while True:
ret, frame = cap.read()
if not ret:
break
faces = processor.detect_faces(frame)
if len(faces) > 0:
landmarks = processor.get_landmarks(frame, faces[0])
frame = processor.add_blink_effect(frame, landmarks)
cv2.imshow("Face Processing", frame)
if args.virtual:
vcam.process_frame(frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
if name == "main":
main()