我不确定瞳孔检测,但眼睛检测并不难,请参阅此示例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
每对眼睛都被多次调用,而它应该只在最后一次回调中被调用。