使用tracking.js跟踪眼球

时间:2015-03-10 06:17:33

标签: javascript image-processing html5-canvas face-detection tracking.js

我正在使用html5画布进行红眼消除效果。我使用tracking.js跟踪眼睛。请检查以下代码。

Html

<!-- Include tracking js libraries -->
<script src="js/tracking-min.js"></script>
<script src="js/eye-min.js"></script>

<img id="sourceImg" src="red_eye1.jpg"  width="202" height="187">
<canvas id="myCanvas" width="202" height="187" style="border:1px solid #d3d3d3;"></canvas>

的Javascript

document.getElementById("sourceImg").onload = function() {
    var c = document.getElementById("myCanvas");
    var ctx = c.getContext("2d");
    var img = document.getElementById("sourceImg");
    ctx.drawImage(img, 0, 0);

    // track eyes
    var tracker = new tracking.ObjectTracker(['eye']);
    tracker.setStepSize(1.7);
    tracking.track('#sourceImg', tracker);
    tracker.on('track', function(event) {
        event.data.forEach(function(rect) {
            // rect consists area of each eyes.
            var imgData = ctx.getImageData(rect.x, rect.y, rect.width, rect.height);
            // remove red eye
            var i;
            for (i = 0; i < imgData.data.length; i += 4) {
                // find and check red intensity
                var redIntensity = (imgData.data[i] / ((imgData.data[i+1] + imgData.data[i+2]) / 2));
                if (redIntensity > 1.5)  // 1.5 because it gives the best results
                {
                    // reduce red to the average of blue and green
                    imgData.data[i] = (imgData.data[i+1] + imgData.data[i+2]) / 2;
                }
            }
            ctx.putImageData(imgData, rect.x, rect.y);

        });
    });  
};

我得到了以下结果。 enter image description here

此处红眼已成功移除。但它影响了眼部周围的颜色。因为tracking.js返回了包括周围区域在内的眼部区域。如何跟踪眼球,这将解决这个问题。

1 个答案:

答案 0 :(得分:3)

快速浏览一下TrackingJS,可以看出它没有提供带红色边界的“眼睛区域”并将其细化为虹膜。

因此,您必须找到提供此优化的跟踪应用程序或自行编写细化代码。

在Stackoverflow中推荐虹膜跟踪库是偏离主题的,并且执行虹膜跟踪的代码答案过于宽泛,无法作为良好的Stackoverflow答案。

话虽如此,这里有 verrrrrry 找到虹膜的大纲:

  • 从TrackingJS检测到的“眼睛区域”开始,

  • 通过对该眼部区域中最白的像素进行颜色测试来获取巩膜的边界框,

  • 在此边界框中,通过颜色测试获得2个巩膜区域之间最暗像素的圆形瞳孔区域。

  • 以圆形瞳孔为基础,通过向外扩展瞳孔圆的半径直至到达白色巩膜来找到​​虹膜。

[其他想法]

我继续思考需要处理的许多非标准情况:

  • 眼睑闭合或眯眼,

  • 虹膜完全左或右,没有白色边界包裹光圈,

  • 由于出现黄疸或血丝,巩膜的颜色不够明显,

  • 眼部化妆品可能比sclara更白,

  • 镜头眩光和反​​射等照片缺陷

  • 而且我没想到更多!

如果您的项目允许,如果用户点击2个瞳孔并扩展瞳孔半径以定义虹膜,则会更容易。学生可能比其他眼睛结构更暗,并且将是圆形的(但可能被眼睑夹住)。

如果您的项目无法允许用户选择瞳孔,您可以使用“边缘检测”算法来隔离瞳孔(可能是Sobel边缘检测)。