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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

1回答

2247閲覧

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

shiato

総合スコア6

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/05/29 03:39

###前提・実現したいこと

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

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

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

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

C++

1 2#include <FaceTracker/Tracker.h> 3#include <opencv/highgui.h> 4#include <iostream> 5//============================================================================= 6void Draw(cv::Mat &image,cv::Mat &shape,cv::Mat &con,cv::Mat &tri,cv::Mat &visi) 7{ 8 int i,n = shape.rows/2; cv::Point p1,p2; cv::Scalar c; 9 10 //draw triangulation 11 c = CV_RGB(0,0,0); 12 for(i = 0; i < tri.rows; i++){ 13 if(visi.at<int>(tri.at<int>(i,0),0) == 0 || 14 visi.at<int>(tri.at<int>(i,1),0) == 0 || 15 visi.at<int>(tri.at<int>(i,2),0) == 0)continue; 16 p1 = cv::Point(shape.at<double>(tri.at<int>(i,0),0), 17 shape.at<double>(tri.at<int>(i,0)+n,0)); 18 p2 = cv::Point(shape.at<double>(tri.at<int>(i,1),0), 19 shape.at<double>(tri.at<int>(i,1)+n,0)); 20 cv::line(image,p1,p2,c); 21 p1 = cv::Point(shape.at<double>(tri.at<int>(i,0),0), 22 shape.at<double>(tri.at<int>(i,0)+n,0)); 23 p2 = cv::Point(shape.at<double>(tri.at<int>(i,2),0), 24 shape.at<double>(tri.at<int>(i,2)+n,0)); 25 cv::line(image,p1,p2,c); 26 p1 = cv::Point(shape.at<double>(tri.at<int>(i,2),0), 27 shape.at<double>(tri.at<int>(i,2)+n,0)); 28 p2 = cv::Point(shape.at<double>(tri.at<int>(i,1),0), 29 shape.at<double>(tri.at<int>(i,1)+n,0)); 30 cv::line(image,p1,p2,c); 31 } 32 //draw connections 33 c = CV_RGB(0,0,255); 34 for(i = 0; i < con.cols; i++){ 35 if(visi.at<int>(con.at<int>(0,i),0) == 0 || 36 visi.at<int>(con.at<int>(1,i),0) == 0)continue; 37 p1 = cv::Point(shape.at<double>(con.at<int>(0,i),0), 38 shape.at<double>(con.at<int>(0,i)+n,0)); 39 p2 = cv::Point(shape.at<double>(con.at<int>(1,i),0), 40 shape.at<double>(con.at<int>(1,i)+n,0)); 41 cv::line(image,p1,p2,c,1); 42 } 43 //draw points 44 for(i = 0; i < n; i++){ 45 if(visi.at<int>(i,0) == 0)continue; 46 p1 = cv::Point(shape.at<double>(i,0),shape.at<double>(i+n,0)); 47 c = CV_RGB(255,0,0); cv::circle(image,p1,2,c); 48 }return; 49} 50//============================================================================= 51int parse_cmd(int argc, const char** argv, 52 char* ftFile,char* conFile,char* triFile, 53 bool &fcheck,double &scale,int &fpd) 54{ 55 int i; fcheck = false; scale = 1; fpd = -1; 56 for(i = 1; i < argc; i++){ 57 if((std::strcmp(argv[i],"-?") == 0) || 58 (std::strcmp(argv[i],"--help") == 0)){ 59 std::cout << "track_face:- Written by Jason Saragih 2010" << std::endl 60 << "Performs automatic face tracking" << std::endl << std::endl 61 << "#" << std::endl 62 << "# usage: ./face_tracker [options]" << std::endl 63 << "#" << std::endl << std::endl 64 << "Arguments:" << std::endl 65 << "-m <string> -> Tracker model (default: ../model/face2.tracker)" 66 << std::endl 67 << "-c <string> -> Connectivity (default: ../model/face.con)" 68 << std::endl 69 << "-t <string> -> Triangulation (default: ../model/face.tri)" 70 << std::endl 71 << "-s <double> -> Image scaling (default: 1)" << std::endl 72 << "-d <int> -> Frames/detections (default: -1)" << std::endl 73 << "--check -> Check for failure" << std::endl; 74 return -1; 75 } 76 } 77 for(i = 1; i < argc; i++){ 78 if(std::strcmp(argv[i],"--check") == 0){fcheck = true; break;} 79 } 80 if(i >= argc)fcheck = false; 81 for(i = 1; i < argc; i++){ 82 if(std::strcmp(argv[i],"-s") == 0){ 83 if(argc > i+1)scale = std::atof(argv[i+1]); else scale = 1; 84 break; 85 } 86 } 87 if(i >= argc)scale = 1; 88 for(i = 1; i < argc; i++){ 89 if(std::strcmp(argv[i],"-d") == 0){ 90 if(argc > i+1)fpd = std::atoi(argv[i+1]); else fpd = -1; 91 break; 92 } 93 } 94 if(i >= argc)fpd = -1; 95 for(i = 1; i < argc; i++){ 96 if(std::strcmp(argv[i],"-m") == 0){ 97 if(argc > i+1)std::strcpy(ftFile,argv[i+1]); 98 else strcpy(ftFile,"../model/face2.tracker"); 99 break; 100 } 101 } 102 if(i >= argc)std::strcpy(ftFile,"../model/face2.tracker"); 103 for(i = 1; i < argc; i++){ 104 if(std::strcmp(argv[i],"-c") == 0){ 105 if(argc > i+1)std::strcpy(conFile,argv[i+1]); 106 else strcpy(conFile,"../model/face.con"); 107 break; 108 } 109 } 110 if(i >= argc)std::strcpy(conFile,"../model/face.con"); 111 for(i = 1; i < argc; i++){ 112 if(std::strcmp(argv[i],"-t") == 0){ 113 if(argc > i+1)std::strcpy(triFile,argv[i+1]); 114 else strcpy(triFile,"../model/face.tri"); 115 break; 116 } 117 } 118 if(i >= argc)std::strcpy(triFile,"../model/face.tri"); 119 return 0; 120} 121//============================================================================= 122int main(int argc, const char** argv) 123{ 124 //parse command line arguments 125 char ftFile[256],conFile[256],triFile[256]; 126 bool fcheck = false; double scale = 1; int fpd = -1; bool show = true; 127 if(parse_cmd(argc,argv,ftFile,conFile,triFile,fcheck,scale,fpd)<0)return 0; 128 129 //set other tracking parameters 130 std::vector<int> wSize1(1); wSize1[0] = 7; 131 std::vector<int> wSize2(3); wSize2[0] = 11; wSize2[1] = 9; wSize2[2] = 7; 132 int nIter = 5; double clamp=3,fTol=0.01; 133 FACETRACKER::Tracker model(ftFile); 134 cv::Mat tri=FACETRACKER::IO::LoadTri(triFile); 135 cv::Mat con=FACETRACKER::IO::LoadCon(conFile); 136 137 //initialize camera and display window 138 cv::Mat frame,gray,im; double fps=0; char sss[256]; std::string text; 139 CvCapture* camera = cvCreateCameraCapture(CV_CAP_ANY); if(!camera)return -1; 140 int64 t1,t0 = cvGetTickCount(); int fnum=0; 141 cvNamedWindow("Face Tracker",1); 142 std::cout << "Hot keys: " << std::endl 143 << "\t ESC - quit" << std::endl 144 << "\t d - Redetect" << std::endl; 145 146 //loop until quit (i.e user presses ESC) 147 bool failed = true; 148 while(1){ 149 //grab image, resize and flip 150 IplImage* I = cvQueryFrame(camera); if(!I)continue; frame = I; 151 if(scale == 1)im = frame; 152 else cv::resize(frame,im,cv::Size(scale*frame.cols,scale*frame.rows)); 153 cv::flip(im,im,1); cv::cvtColor(im,gray,CV_BGR2GRAY); 154 155 //track this image 156 std::vector<int> wSize; if(failed)wSize = wSize2; else wSize = wSize1; 157 if(model.Track(gray,wSize,fpd,nIter,clamp,fTol,fcheck) == 0){ 158 int idx = model._clm.GetViewIdx(); failed = false; 159 Draw(im,model._shape,con,tri,model._clm._visi[idx]); 160 }else{ 161 if(show){cv::Mat R(im,cvRect(0,0,150,50)); R = cv::Scalar(0,0,255);} 162 model.FrameReset(); failed = true; 163 } 164 //draw framerate on display image 165 if(fnum >= 9){ 166 t1 = cvGetTickCount(); 167 fps = 10.0/((double(t1-t0)/cvGetTickFrequency())/1e+6); 168 t0 = t1; fnum = 0; 169 }else fnum += 1; 170 if(show){ 171 sprintf(sss,"%d frames/sec",(int)round(fps)); text = sss; 172 cv::putText(im,text,cv::Point(10,20), 173 CV_FONT_HERSHEY_SIMPLEX,0.5,CV_RGB(255,255,255)); 174 } 175 //show image and check for user input 176 imshow("Face Tracker",im); 177 int c = cvWaitKey(10); 178 if(c == 27)break; else if(char(c) == 'd')model.FrameReset(); 179 }return 0; 180} 181//============================================================================= 182

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

###補足情報(言語/FW/ツール等のバージョンなど)
まだプログラムを初めて間もないので、.cppや.ccの拡張子の違いなどもわからず、具体的な解決方法もわかっておりません
どうぞよろしくお願いいたします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_obara

2017/05/29 07:12

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

2017/05/29 07:45

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

回答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 04:32

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shiato

2017/05/29 08: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件発生いたしました。 どうぞよろしくお願い致します。
Chironian

2017/05/29 08:16

cv:MatはOpenCVのクラスです。それがリンクできないと言っているので、OpenCVのライブラリとリンクできていません。 上記解説ページの「2.4 ライブラリパス設定」の設定をみて設定してみて下さい。
shiato

2017/05/31 01:58

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

2017/05/31 03:46

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問