質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.37%

visual studio でface_trackerをしたいのですが、、、

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,877

score 6

前提・実現したいこと

現在 visual studio 2013を使用してコンソールアプリケーションを作成しています。
使用言語はC++です。その上で、webカメラを用いて、face track(顔追跡)を行いたいと思っています。
そして、できれば顔の各特徴点の追跡を行いたいと思っています。なにか方法はありませんか?
自分で探してみたことを書いてみます。
まずはfacetrackerのサンプルを動かしてみようと、インターネットで探してみるとGitHubのFaceTrackerというのが見つかりました。このサイトのプログラムをダウンロードして実際の使用しようとしてみたのですが、動かせませんでした。

発生している問題・エラーメッセージ

プログラムコードが.ccだからなのか分かりませんが、ビルド、デバッグ等が行えませんでした。

該当のソースコード

こちらが実際にダウンロードしたプログラムコードです
これは何の動作をするコードなのかもわかっておらず、すいません

#include <FaceTracker/Tracker.h>
#include <opencv/highgui.h>
#include <iostream>
//=============================================================================
void Draw(cv::Mat &image,cv::Mat &shape,cv::Mat &con,cv::Mat &tri,cv::Mat &visi)
{
  int i,n = shape.rows/2; cv::Point p1,p2; cv::Scalar c;

  //draw triangulation
  c = CV_RGB(0,0,0);
  for(i = 0; i < tri.rows; i++){
    if(visi.at<int>(tri.at<int>(i,0),0) == 0 ||
       visi.at<int>(tri.at<int>(i,1),0) == 0 ||
       visi.at<int>(tri.at<int>(i,2),0) == 0)continue;
    p1 = cv::Point(shape.at<double>(tri.at<int>(i,0),0),
           shape.at<double>(tri.at<int>(i,0)+n,0));
    p2 = cv::Point(shape.at<double>(tri.at<int>(i,1),0),
           shape.at<double>(tri.at<int>(i,1)+n,0));
    cv::line(image,p1,p2,c);
    p1 = cv::Point(shape.at<double>(tri.at<int>(i,0),0),
           shape.at<double>(tri.at<int>(i,0)+n,0));
    p2 = cv::Point(shape.at<double>(tri.at<int>(i,2),0),
           shape.at<double>(tri.at<int>(i,2)+n,0));
    cv::line(image,p1,p2,c);
    p1 = cv::Point(shape.at<double>(tri.at<int>(i,2),0),
           shape.at<double>(tri.at<int>(i,2)+n,0));
    p2 = cv::Point(shape.at<double>(tri.at<int>(i,1),0),
           shape.at<double>(tri.at<int>(i,1)+n,0));
    cv::line(image,p1,p2,c);
  }
  //draw connections
  c = CV_RGB(0,0,255);
  for(i = 0; i < con.cols; i++){
    if(visi.at<int>(con.at<int>(0,i),0) == 0 ||
       visi.at<int>(con.at<int>(1,i),0) == 0)continue;
    p1 = cv::Point(shape.at<double>(con.at<int>(0,i),0),
           shape.at<double>(con.at<int>(0,i)+n,0));
    p2 = cv::Point(shape.at<double>(con.at<int>(1,i),0),
           shape.at<double>(con.at<int>(1,i)+n,0));
    cv::line(image,p1,p2,c,1);
  }
  //draw points
  for(i = 0; i < n; i++){    
    if(visi.at<int>(i,0) == 0)continue;
    p1 = cv::Point(shape.at<double>(i,0),shape.at<double>(i+n,0));
    c = CV_RGB(255,0,0); cv::circle(image,p1,2,c);
  }return;
}
//=============================================================================
int parse_cmd(int argc, const char** argv,
          char* ftFile,char* conFile,char* triFile,
          bool &fcheck,double &scale,int &fpd)
{
  int i; fcheck = false; scale = 1; fpd = -1;
  for(i = 1; i < argc; i++){
    if((std::strcmp(argv[i],"-?") == 0) ||
       (std::strcmp(argv[i],"--help") == 0)){
      std::cout << "track_face:- Written by Jason Saragih 2010" << std::endl
       << "Performs automatic face tracking" << std::endl << std::endl
       << "#" << std::endl 
       << "# usage: ./face_tracker [options]" << std::endl
       << "#" << std::endl << std::endl
       << "Arguments:" << std::endl
       << "-m <string> -> Tracker model (default: ../model/face2.tracker)"
       << std::endl
       << "-c <string> -> Connectivity (default: ../model/face.con)"
       << std::endl
       << "-t <string> -> Triangulation (default: ../model/face.tri)"
       << std::endl
       << "-s <double> -> Image scaling (default: 1)" << std::endl
       << "-d <int>    -> Frames/detections (default: -1)" << std::endl
       << "--check     -> Check for failure" << std::endl;
      return -1;
    }
  }
  for(i = 1; i < argc; i++){
    if(std::strcmp(argv[i],"--check") == 0){fcheck = true; break;}
  }
  if(i >= argc)fcheck = false;
  for(i = 1; i < argc; i++){
    if(std::strcmp(argv[i],"-s") == 0){
      if(argc > i+1)scale = std::atof(argv[i+1]); else scale = 1;
      break;
    }
  }
  if(i >= argc)scale = 1;
  for(i = 1; i < argc; i++){
    if(std::strcmp(argv[i],"-d") == 0){
      if(argc > i+1)fpd = std::atoi(argv[i+1]); else fpd = -1;
      break;
    }
  }
  if(i >= argc)fpd = -1;
  for(i = 1; i < argc; i++){
    if(std::strcmp(argv[i],"-m") == 0){
      if(argc > i+1)std::strcpy(ftFile,argv[i+1]);
      else strcpy(ftFile,"../model/face2.tracker");
      break;
    }
  }
  if(i >= argc)std::strcpy(ftFile,"../model/face2.tracker");
  for(i = 1; i < argc; i++){
    if(std::strcmp(argv[i],"-c") == 0){
      if(argc > i+1)std::strcpy(conFile,argv[i+1]);
      else strcpy(conFile,"../model/face.con");
      break;
    }
  }
  if(i >= argc)std::strcpy(conFile,"../model/face.con");
  for(i = 1; i < argc; i++){
    if(std::strcmp(argv[i],"-t") == 0){
      if(argc > i+1)std::strcpy(triFile,argv[i+1]);
      else strcpy(triFile,"../model/face.tri");
      break;
    }
  }
  if(i >= argc)std::strcpy(triFile,"../model/face.tri");
  return 0;
}
//=============================================================================
int main(int argc, const char** argv)
{
  //parse command line arguments
  char ftFile[256],conFile[256],triFile[256];
  bool fcheck = false; double scale = 1; int fpd = -1; bool show = true;
  if(parse_cmd(argc,argv,ftFile,conFile,triFile,fcheck,scale,fpd)<0)return 0;

  //set other tracking parameters
  std::vector<int> wSize1(1); wSize1[0] = 7;
  std::vector<int> wSize2(3); wSize2[0] = 11; wSize2[1] = 9; wSize2[2] = 7;
  int nIter = 5; double clamp=3,fTol=0.01; 
  FACETRACKER::Tracker model(ftFile);
  cv::Mat tri=FACETRACKER::IO::LoadTri(triFile);
  cv::Mat con=FACETRACKER::IO::LoadCon(conFile);

  //initialize camera and display window
  cv::Mat frame,gray,im; double fps=0; char sss[256]; std::string text; 
  CvCapture* camera = cvCreateCameraCapture(CV_CAP_ANY); if(!camera)return -1;
  int64 t1,t0 = cvGetTickCount(); int fnum=0;
  cvNamedWindow("Face Tracker",1);
  std::cout << "Hot keys: "        << std::endl
        << "\t ESC - quit"     << std::endl
        << "\t d   - Redetect" << std::endl;

  //loop until quit (i.e user presses ESC)
  bool failed = true;
  while(1){ 
    //grab image, resize and flip
    IplImage* I = cvQueryFrame(camera); if(!I)continue; frame = I;
    if(scale == 1)im = frame; 
    else cv::resize(frame,im,cv::Size(scale*frame.cols,scale*frame.rows));
    cv::flip(im,im,1); cv::cvtColor(im,gray,CV_BGR2GRAY);

    //track this image
    std::vector<int> wSize; if(failed)wSize = wSize2; else wSize = wSize1; 
    if(model.Track(gray,wSize,fpd,nIter,clamp,fTol,fcheck) == 0){
      int idx = model._clm.GetViewIdx(); failed = false;
      Draw(im,model._shape,con,tri,model._clm._visi[idx]); 
    }else{
      if(show){cv::Mat R(im,cvRect(0,0,150,50)); R = cv::Scalar(0,0,255);}
      model.FrameReset(); failed = true;
    }     
    //draw framerate on display image 
    if(fnum >= 9){      
      t1 = cvGetTickCount();
      fps = 10.0/((double(t1-t0)/cvGetTickFrequency())/1e+6); 
      t0 = t1; fnum = 0;
    }else fnum += 1;
    if(show){
      sprintf(sss,"%d frames/sec",(int)round(fps)); text = sss;
      cv::putText(im,text,cv::Point(10,20),
          CV_FONT_HERSHEY_SIMPLEX,0.5,CV_RGB(255,255,255));
    }
    //show image and check for user input
    imshow("Face Tracker",im); 
    int c = cvWaitKey(10);
    if(c == 27)break; else if(char(c) == 'd')model.FrameReset();
  }return 0;
}
//=============================================================================

試したこと

新しくプログラムを作成して、ソースコードをコピペし、NuGetでopencvを導入してうごかしてみたりしてみました。

補足情報(言語/FW/ツール等のバージョンなど)

まだプログラムを初めて間もないので、.cppや.ccの拡張子の違いなどもわからず、具体的な解決方法もわかっておりません
どうぞよろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • t_obara

    2017/05/29 16:12

    基本的には、カメラから映像をキャプチャ、キャプチャ画像から顔検出、検出した際の特徴点を元に、物体追跡を行うことで、顔を追跡するというフローとなります。OpenCVであらかじめ用意されたAPIを利用すると、もう少し見通しが良く作成できるのではないでしょうか。

    キャンセル

  • shiato

    2017/05/29 16:45

    あまり詳しく書いてなく申し訳ありません。現在はvisual studio2013を使い、NuGetにより、OpenCVをインストールして、OpenCVのオプティカルフローを用いてマーカの追跡等を行っておりました。その上で、顔の特徴点をマーカを張らずに追跡できたらいいと考え、face_trackerに手を出した所存です。

    キャンセル

回答 1

0

こんにちは。

FaceTrackerが複数ありました。たぶんこれと思いますが、最初からリンクしておいて頂ければ探す必要がないので、より回答しやすいです。

These instructions are for compiling the code on OS X and Ubuntu, but it should be possible to compile on other platforms.

と書かれているので、OS XとUbuntuならビルドした実績はあるようです。
また、他の環境でもコンパイルできる可能性があると書かれているので、ビルドにトライしてみるのは手ですね。

まず、shiatoさんはOpenCVをどのようにして組込みましたでしょうか?
特にそのインクルード・パスやライブラリ・パスを適切に指定できていることをどのようにして確認しましたか?(OpenCVのサンプルをビルドしてみるなど)
もし、未確認であれば、初めてのOpenCV開発 ― Visual Studio/CMake/NuGetでプロジェクト作成【OpenCV 3.0/3.1】などを、参考にFaceTrackerが使っているOpenCV 3を組込みましょう。

以上が既に済んでいる場合、shiatoさんがトライされた時、どんなエラーがでましたか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/29 17:05

    Chironianさん回答ありがとうございます。
    プログラムのダウンロード先のリンクの方法をご指摘ありがとうございます、
    OpenCVの組み込みに関しては、NuGetパッケージの管理を使用して、OpenCVを導入致しました。
    OpenCVの導入確認として、サンプルコードを試しに動かしたところ動作を確認することができました。
    GitHubでダウンロードしたフォルダから、ヘッダーファイルなどもコピーしたのですが、
    エラーとして
    error LNK2019: 未解決の外部シンボル "public: static class cv::Mat __cdecl FACETRACKER::IO::LoadCon(char const *)" (?LoadCon@IO@FACETRACKER@@SA?AVMat@cv@@PBD@Z) が関数 _main で参照されました。\Documents\Visual Studio 2013\Projects\face_tracker\face_tracker\face_tracker.obj face_tracker
    等のエラーが7件発生いたしました。
    どうぞよろしくお願い致します。

    キャンセル

  • 2017/05/29 17:16

    cv:MatはOpenCVのクラスです。それがリンクできないと言っているので、OpenCVのライブラリとリンクできていません。

    上記解説ページの「2.4 ライブラリパス設定」の設定をみて設定してみて下さい。

    キャンセル

  • 2017/05/31 10:58

    ご返信遅れて申し訳ありません、
    上記のリンクを参考に、ライブラリパス設定を行いましたが、できませんでした。
    この場合、NuGetを使わずに、公式パッケージを使ったインストール方法を行ったほうが良いのでしょうか?

    キャンセル

  • 2017/05/31 12:46

    なんとも言えません。
    FaceTrackerはWindowsでビルドできることを作者さんは確認していないようですから、ビルドできなくても可笑しくはないです。
    ただ、OpenCVのライブラリとリンクできていないままであれば、単なる設定ミスであることは間違いないです。どこかに潜む設定ミスをどうやれば発見できるのか、考えてみるしかないです。
    私なら、既にビルドに成功しているOpenCVのサンプルのソースをFaceTrackerの中身で置き換えてみるかも。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る