faceTracker for Windows
先日むすめの大好きなりらっ○まをAIで起こしたりしました。なんでもアピアランス魔人が流行しているようでわたしもやってみましたが…やっぱ、不透明マスクとブレンドのコンボでぐりぐりいくのがわたしの性には合っている様な気がした次第です。しかもスクショ取っている時に誤ってデータ破棄しちゃったので再度作り直したというおまけまで付いてしまったのでした。
で、本題。そんなこんなで、ようやく動きましたWindouws版フェーストラッカーです。
といいつつも、ウインドウズでのテストはESTKのみという…
これぐらいしかお見せするものはございませんwせっかくですのでソースを公開しちゃいましょう。
#faceDetecter.cpp
#include <opencv2/opencv.hpp>#include <opencv/cv.h>
#include <stdlib.h>
#include <string.h>
#include <sstream>
#include “SoSharedLibDefs.h”
#include “SoCClient.h”
#include “faceDetecter.h”
#if defined (_WINDOWS)
#pragma warning(push)
#pragma warning(disable : 4996) // Turn off warning about deprecated strcpy on Win
#define strdup _strdup
#endif
using namespace std;
static char* getNewBuffer(string& s)
{
// Dynamically allocate memory buffer to hold the string
// to pass back to JavaScript
char* buff = new char[1+s.length()];
memset(buff, 0, s.length()+1);
strcpy(buff, s.c_str());
return buff;
}
static long libraryVersionNumber = 1;
extern “C” FACEDETECTER_API long ESGetVersion()
{
return libraryVersionNumber;
}
extern “C” FACEDETECTER_API long trackFace (TaggedData* argv, long argc, TaggedData* result)
{
char *tgFilePath, *CASCADE_NAME;
IplImage* tgImg;
int errval = kESErrOK;
float scale = 1.11;
int mnvrs = 4;
int msize = 80;
if (argc >= 2)
{
tgFilePath = argv[0].data.string;
CASCADE_NAME = argv[1].data.string;
if (argc >= 3)
{
return kESErrBadArgumentList;
}
CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*) cvLoad (CASCADE_NAME, 0, 0, 0);
CvMemStorage* storage = cvCreateMemStorage(0);
assert (storage);
if (! cascade)
{
return kESErrNoFile;
}
tgImg = cvLoadImage(tgFilePath, CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
if (! tgImg)
{
return kESErrNoFile;
}
CvSeq* face;
CvSize csz = cvSize(msize, msize);
// detect faces.
face = cvHaarDetectObjects (tgImg, cascade, storage,
scale, mnvrs, CV_HAAR_DO_CANNY_PRUNING,
csz);
// Create the script.
std::string str;
str = “[“;
std::ostringstream ostr;
for (int i=0; i<face->total; i++)
{
CvRect* faceRect = (CvRect*)cvGetSeqElem(face, i);
ostr << faceRect->x << “,” << faceRect->y << “,”
<< faceRect->width << “,” <<faceRect->height;
if (i<face->total-1)
ostr << “,”;
}
str += ostr.str();
str += “]”;
string s(str);
result->type = kTypeScript;
result->data.string = getNewBuffer(s);
cvReleaseMemStorage(&storage);
cvReleaseHaarClassifierCascade(&cascade);
cvReleaseImage(&tgImg);
return errval;
}
else
{
return kESErrBadArgumentList;
}
}
#faceDetecter.h
// faceDetecter.h : faceDetecter.DLL のメイン ヘッダー ファイル//
#if defined FACEDETECTER_EXPORTS
#define FACEDETECTER_API __declspec(dllexport)
#endif
cppファイルとヘッダファイルです。もちろんOpenCVは別途導入下さい。インストーラ一発ですので問題ないでしょう。ライブラリ自体がしっかりしているのですごーくすかすかのコードです。でもお顔をしっかり検出出来ちゃいます。
下のヤツがこのdllを使ったJSXサンプルです。
#faceDetecter.jsx
var f = File.openDialog (“select a file…”);var tgtFile = f.fsName;
var crrnt = File ($.fileName).parent;
var lib = crrnt.fsName + “\\faceDetecter.dll”;
var cascadeFile = crrnt.fsName + “\\haarcascade_frontalface_alt_tree.xml”;
try{
var obj = new ExternalObject(“lib:” + lib);
alert (obj.trackFace(tgtFile, cascadeFile)); obj.unload();
}catch(o_O){
alert(o_O);
obj.unload();
}</p>
カスケードファイルはOpenCVにも添付されています。お好みで使い分けて下さい。
最後にこちらがExternalObjectの本体のDLLです。
最近、地球テーマのイメージのダウンロードが増えていると思ったらEarth Dayが近いんです。