Current section
Files
Jump to
Current section
Files
src/vice_facedetect.erl
% @hidden
-module(vice_facedetect).
-export([
faces/3,
faces/1,
faces_with_eyes/1,
first_face/1
]).
-export([init/0]).
-on_load(init/0).
-define(APPNAME, vice).
-define(LIBNAME, vice_facedetect).
-define(CASCADE_FACE_XML, "haarcascade_frontalface_alt2.xml").
-define(CASCADE_EYES_XML, "haarcascade_eye_tree_eyeglasses.xml").
faces(Img) ->
case buccode:priv_dir(?APPNAME) of
error ->
error;
Path ->
faces(bucs:to_binary(Img),
bucs:to_binary(filename:join([Path, ?CASCADE_FACE_XML])),
bucs:to_binary(filename:join([Path, ?CASCADE_EYES_XML])))
end.
faces(_, _, _) ->
not_loaded(?LINE).
faces_with_eyes(Img) ->
case faces(Img) of
{ok, Faces} ->
case buclists:delete_if(fun(E) ->
case lists:keyfind(eyes, 1, E) of
{eyes, []} ->
true;
_ ->
false
end
end, Faces) of
[] ->
{error, no_face_found};
Result ->
{ok, Result}
end;
Error ->
Error
end.
first_face(Img) ->
case faces(Img) of
{ok, [Face|_] = Faces} ->
case buclists:delete_if(fun(E) ->
case lists:keyfind(eyes, 1, E) of
{eyes, []} ->
true;
_ ->
false
end
end, Faces) of
[] ->
{ok, Face};
[Result|_] ->
{ok, Result}
end;
Error ->
Error
end.
init() ->
SoName = case code:priv_dir(?APPNAME) of
{error, bad_name} ->
case filelib:is_dir(filename:join(["..", priv])) of
true ->
filename:join(["..", priv, ?LIBNAME]);
_ ->
filename:join([priv, ?LIBNAME])
end;
Dir ->
filename:join(Dir, ?LIBNAME)
end,
case filelib:wildcard([SoName|".*"]) of
[_|_] ->
erlang:load_nif(SoName, 0);
_ ->
ok
end.
not_loaded(Line) ->
{error, {not_loaded, [{module, ?MODULE}, {line, Line}]}}.