
เนื่องจากเป็น app อย่าง snapchat , SNOW ซึ่งเป็นการใส่ลูกเล่นให้กับวีดีโอที่เราถ่าย จึงเกิดความสงสัยว่าเขามีหลักการหรือวิธีการอย่างไร ในบทความนี้จะเป็นการทำแบบเบื้องต้น โดยการใช้ javascript + html canvas ครับ
ในการทำการนั้นต้องใช้ html cavans + js ชื่อ tracking.js เป็น lib สำหรับ detect vdo และ image ซึ่งจะสามารถ detect ได้หลายแบบ ทั้ง ปาก จมูก ตา โครงหน้า สี เป็นต้น
เรามาดูแบบที่เสร็จแล้วกันครับ
จากตัวอย่าง
-ใช้ tracking js ในการจับ ตำแหน่งของหน้า
– ทำการ render รูปภาพหน้ากากเข้าไปใน vdo ตามขนาดที่ tracking js คื่นค่าตำแหน่งมาให้
เราจะมาดู code ทังหมดกันครับ
1 เราจะ include lib tracking js
<script src="build/tracking-min.js"></script> <script src="build/data/face-min.js"></script>
2 ส่วนของ html ที่ใช้
<div class="center">
<video id="video" width="240" height="320" preload autoplay loop muted>
<source src="assets/java.mp4" type="video/mp4">
</video>
<canvas id="canvas" width="240" height="320"></canvas>
</div>
3 ส่วนของ js ในการควบคุม
window.onload = function() {
var video = document.getElementById('video'); // Object vdo
var canvas = document.getElementById('canvas'); // Object cavas
var context = canvas.getContext('2d');
var watermark = new Image();
watermark.src = 'assets/face1.png'; // รูปภาพที่ใช้เป็นหน้ากาก
var tracker = new tracking.ObjectTracker('face'); // instant tracker เลือก face
tracker.setInitialScale(4);
tracker.setStepSize(1);
tracker.setEdgesDensity(0.12);
tracking.track('#video', tracker);
tracker.on('track', function(event) {
context.clearRect(0, 0, canvas.width, canvas.height); // เคลีย canvas
event.data.forEach(function(rect){ // loop detect ค่า rect คือค่า ตำแหน่ง x , y , width , height ของ หน้าที่ tracker จัดได้จาก vdo
context.drawImage(watermark, rect.x, rect.y, rect.width, rect.height); // ทำการ render image ลงไปใน canvas ตามตำแหน่งที่ต้องที่รับค่า
});
});
เป็นอันเรียบร้อยสำหรับการทำในการ detect หน้าเบื้องอย่างเดียว แต่ถ้าอยากทำให้เนียนนั้นอาจต้อง detect ในหลายๆส่วนทั้งหน้า จมูก ปาก ตา เพื่อให้ลูกเล่นมีมากขึ้น
สามารถโหลดไปศึกษากันได้ครับ