3

我正在进行一个项目,该项目涉及创建一个在线工具,通过网络摄像头/相机静态照片测量一个人的瞳孔距离。棘手的部分与照片中瞳孔的自动检测有关。我对这种图像处理的经验很少/没有,但我一直在做一些研究。

到目前为止,我正在考虑通过 node.js 使用这个可用的库来使用 openCV:https ://github.com/peterbraden/node-opencv 。

我在正确的轨道上吗?与更成熟的 C++/java/python/etc 相比,这个库的功能似乎有限,但是这个项目的时间表不允许我在此过程中学习一门新语言。

只是想联系任何对这种事情有更多经验的人,任何提示/等都非常受欢迎。谢谢!

4

1 回答 1

1

我不确定瞳孔检测,但眼睛检测并不难,请参阅此示例CoffeeScript

opencv = require "opencv"

detect = (im) ->
    im.detectObject "./node_modules/opencv/data/haarcascade_mcs_eyepair_small.xml", {}, (err, eyepairs) ->
        im.rectangle [eyepair.x, eyepair.y], [eyepair.x+eyepair.width, eyepair.y+eyepair.height] for eyepair in eyepairs
        for eyepair in eyepairs
            if ((eyepair.x - lasteyepair.x) ** 2 + (eyepair.y - lasteyepair.y) ** 2 < 500)
                lasteyepair = eyepair
                foundEye = true
                im2 = im.roi Math.max(eyepair.x-10,0), Math.max(eyepair.y-10,0), Math.min(eyepair.width+20,im.width()), Math.min(eyepair.height+20,im.height())
                im2.detectObject "./node_modules/opencv/data/haarcascade_eye.xml", {}, (err, eyes) ->
                    im.rectangle [Math.max(eyepair.x-10+eye.x,0), Math.max(eyepair.y-10+eye.y,0)], [eyepair.x-10+eye.x+eye.width, eyepair.y-10+eye.y+eye.height] for eye in eyes
                    console.log "eyes", eyes
                    im.save "site/webcam.png"

camera = new opencv.VideoCapture 0
capture = () ->
    camera.read (err, im) ->
        if err
            camera.close()
            console.error err
        else
            detect im
            setTimeout capture, 1000

setTimeout capture, 2000

使用Viola-Jones 方法检测对象,该方法由 异步调用detectObject。一旦检测完成,就会调用一个回调来处理找到的对象的位置和大小。我分两个阶段进行检测:首先我检测相当快速和稳定的眼睛,然后我将图像裁剪为眼睛周围的一个矩形并检测其中的眼睛。如果你想检测瞳孔,你应该找到一个用于瞳孔检测的级联(不应该太难,因为瞳孔基本上是一个黑点),裁剪每只眼睛周围的图像并在那里检测瞳孔。

附录:我的代码有一个小错误:im.save每对眼睛都被多次调用,而它应该只在最后一次回调中被调用。

于 2014-04-08T10:05:37.110 回答