首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用tracking.js跟踪眼球

用tracking.js跟踪眼球
EN

Stack Overflow用户
提问于 2015-03-10 06:17:32
回答 1查看 2.8K关注 0票数 3

我正在使用html5画布来去除红眼效果。我用tracking.js追踪眼睛。检查以下代码。

代码语言:javascript
复制
<!-- 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

代码语言: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);

        });
    });  
};

我得到了以下结果。

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

EN

回答 1

Stack Overflow用户

发布于 2015-03-10 08:03:26

快速查看一下TrackingJS就会发现,它并不能将你的红边“眼睛区域”细化成虹膜。

因此,您将不得不找到一个跟踪应用程序,确实提供这种精化或代码完善自己。

推荐一个虹膜跟踪库是非主题的堆栈溢出和代码答案,它的虹膜跟踪是太广泛的资格作为一个良好的堆栈溢出答案。

说过,这是一个 verrrrrry 关于寻找虹膜的大致轮廓:

  • 从TrackingJS检测到的“眼睛区域”开始,
  • 通过对眼睛区域中最白像素的颜色测试,获得巩膜的边界框,
  • 在这个包围框中,通过对两个巩膜区域之间最暗像素的颜色测试,得到圆形瞳孔区域。
  • 以圆形瞳孔为基础,通过向外扩展瞳孔圆的半径找到虹膜,直到你到达白色巩膜。

附加思想

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

  • 眼睑是闭着的或者是斜视的,
  • 虹膜完全向左或向右,没有白色边界包围虹膜,
  • 巩膜由于有黄疸或有血痕,所以颜色不够明显,
  • 可能比巩膜更白的眼妆,
  • 像镜头耀斑和反光这样的照片瑕疵,
  • 还有更多我没想过的!

如果你的项目允许的话,如果用户点击两个瞳孔并扩大瞳孔半径来定义虹膜,那就容易多了。瞳孔可能比其他眼睛结构更暗,而且是圆形的(但可能被眼睑夹住)。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28957268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档