-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathcbscript.js
More file actions
100 lines (84 loc) · 2.8 KB
/
Copy pathcbscript.js
File metadata and controls
100 lines (84 loc) · 2.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
const video = document.getElementById("video");
const output = document.getElementById("output");
const assignProfileBtn = document.getElementById("assignProfileBtn");
const profileImgContainer = document.getElementById("profileImgContainer");
let isProfileAssigned = false;
let ageAndGenderData = null;
Promise.all([
faceapi.nets.tinyFaceDetector.loadFromUri("models"),
faceapi.nets.faceLandmark68Net.loadFromUri("models"),
faceapi.nets.faceRecognitionNet.loadFromUri("models"),
faceapi.nets.faceExpressionNet.loadFromUri("models"),
faceapi.nets.ageGenderNet.loadFromUri("models"),
]).then(webCam);
function webCam() {
navigator.mediaDevices
.getUserMedia({
video: true,
audio: false,
})
.then((stream) => {
video.srcObject = stream;
})
.catch((error) => {
console.log(error);
});
}
video.addEventListener("play", () => {
const canvas = faceapi.createCanvasFromMedia(video);
document.body.append(canvas);
faceapi.matchDimensions(canvas, { height: video.height, width: video.width });
setInterval(async () => {
const detection = await faceapi
.detectAllFaces(video, new faceapi.TinyFaceDetectorOptions())
.withFaceLandmarks()
.withFaceExpressions().withAgeAndGender();
canvas.getContext("2d").clearRect(0, 0, canvas.width, canvas.height);
const resizedDetections = faceapi.resizeResults(detection, {
height: video.height,
width: video.width,
});
faceapi.draw.drawDetections(canvas, resizedDetections);
faceapi.draw.drawFaceLandmarks(canvas, resizedDetections);
displayAgeAndGender(resizedDetections);
}, 100);
});
function getProfileImage(age, gender) {
let ageRange;
if (age < 18) {
ageRange = "baby_child";
} else if (age < 60) {
ageRange = "young_adult";
} else {
ageRange = "elder";
}
let genderPrefix = gender === "male" ? "male_" : "female_";
let profileImage = `images/profilePics/custom/${genderPrefix}${ageRange}.png`;
return profileImage;
}
function displayAgeAndGender(detections) {
output.innerHTML = "";
detections.forEach((det) => {
const age = Math.round(det.age);
const gender = det.gender.charAt(0).toUpperCase() + det.gender.slice(1);
const p = document.createElement("p");
p.textContent = `${age} year old ${gender}`;
output.appendChild(p);
ageAndGenderData = { age, gender };
});
}
assignProfileBtn.addEventListener("click", () => {
if (ageAndGenderData) {
const { age, gender } = ageAndGenderData;
const profileImage = getProfileImage(age, gender);
renderProfileImage(profileImage);
isProfileAssigned = true;
}
});
function renderProfileImage(imageSrc) {
profileImgContainer.innerHTML = "";
const image = new Image();
image.src = imageSrc;
image.className = "profileImage";
profileImgContainer.appendChild(image);
}