ラベル OpenCV の投稿を表示しています。 すべての投稿を表示
ラベル OpenCV の投稿を表示しています。 すべての投稿を表示

2017年2月25日土曜日

OpenCV Viz のinstall (Windows10, Visual studio 2013)

3Dの点群の表示をしてくれるViz。しかし、これはexeからそのままインストールしたのでは入りません。

1.PCL1.8.0 (=VTK)
実際にはVTKがいるのですが、PCLをいれるともれなく3rd partyでついてくるのでPCLを入れます。ここからダウンロード。

その後は、環境変数の設定。(インストール時に自動での設定を選択しても可)
変数名変数値
PCL_ROOTC:\Program Files\PCL 1.8.0 (またはC:\Program Files (x86)\PCL 1.8.0)
Path;%PCL_ROOT%\bin
;%OPENNI2_REDIST64% (または%OPENNI2_REDIST%)
2.cmake
cmakeのConfigureで
WITH_VTK
にチェック。次にVTKのパスを教える。
VTL_DIR -> C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\cmake\vtk-7.0
configure + Generate するとslnができるので実行し、コンパイルする。


3.

参考:
http://qiita.com/SatoshiRobatoFujimoto/items/a91a60bb511070164b53
http://d.hatena.ne.jp/takmin/20140916/1410879770

2016年5月16日月曜日

cv::Rect を vector に保存すると遅かったので 構造体で高速化

原因はわかりませんが、
std::vector(cv::Rect) Rects;
で作った値に、push_backで追加するとすさまじく遅い。毎ループ3 つ追加するだけなのに、
100ms
なんじゃこれ?

検証する時間がもったいないので、取りあえず改造して高速化する。
欲しいのは、
x
y
height
width
だけなので、その分だけの構造体を作って、
typedef struct{
int x, y, width, height;
}Region;

std::vector<Region> Regions;

って感じに変える。
こうすると、1ms以下。

クラスの追加でいろいろと変な処理が入っていると思います。おそらくRectのクラスの中を見るとわかるんでしょうが、時間がもったいないのでしない。

取りあえず、高速化できたからよしとしよう。

2016年3月10日木曜日

OpenCV3.0 で already defined の LINK error

OpenCV3.0に変更した際にでた山のようなLinker Error. 下のような感じ。

Error 1 error LNK2005: "public: __thiscall std::_Container_base12::~_Container_base12(void)" (??1_Container_base12@std@@QAE@XZ) already defined in foo.lib(foo.obj) C:\foo\msvcprtd.lib(MSVCP120D.dll) footest

どうやら2回定義しているらしい。ってことで、以下のことをしたら治りました。なんで治ったか、面倒で考察はあと。

1.
C++ -> Code Generation
  Runtime Library を Multi-threaded Debut(/MTd)
に変更

2.
Linker->input
 Ignore Specific Default Libraries に LIBCMTD.lib
を加える。

reference:
http://stackoverflow.com/questions/8498291/standard-library-already-defined-in-lib-causing-linker-error
https://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx

2016年2月13日土曜日

Windows.h と OpenCV を同時に使ったときのコンパイルエラー

元々、OpenCVのプログラムの上に、時間を測ろうと思ってTimegettime()を使おうとして、Windows.h をインクルードしました。
したら、

'(' : illegal token on right side of '::'

ノー!!。

なんか調べてみると、defineされたminがコンフリクトを起こしているようです。

#include <Windows.h>
#include <opencv2/core/core.hpp>

ではエラーを起こすので、調べてみると便利なdefineがありました。

#define NOMINMAX
#include <Windows.h>
#include <opencv2/core/core.hpp>

オー、コンパイル通ったー。

まぁ、こんなの使うなって感じですが・・・。ちょっとしたことですが、まぁ、便利なので使ってちょっとハマってしまった件でした。

参考;
http://stackoverflow.com/questions/5004858/stdmin-gives-error

2015年8月20日木曜日

OpenCV で別に取得した二つの画像を合成して表示

2つのWebカメラで取得した画像を1枚のWindowで表示させようと思い、チャレンジしていたら、アホなことで1時間ほど悩んでしまいました。

まず、やり方としては、

1.合成後のイメージを作る
2.合成前のイメージを合成後のイメージにコピーする領域を作り、2つを関連付ける。
3.合成前のイメージを合成後のイメージにコピーする。
4.表示

ではソースは。(簡易ソースなのでWebカメラの分は抜いています。また、合成前のイメージは640x480としています。)

// 合成前のイメージ Windowの準備
cv::Mat cam1image;
cv::Mat cam2image;
cv::namedWindow("Camera Image", CV_WINDOW_AUTOSIZE);

// 1. 合成後のイメージを作る
cv::Mat combinedImage(cv::Size(1280, 480), CV_8UC3);

// 2. 合成前のイメージを合成後のイメージにコピーする領域を作り、2つを関連付ける。
cv::Mat imageLeft(combinedImage, cv::Rect(0, 0, cam1image.cols, cam1image.rows));
cv::Mat imageRight(combinedImage, cv::Rect(640, 0, cam2image.cols, cam2image.rows));

// 3.合成前のイメージを合成後のイメージにコピーする。
cam1image.copyTo(imageLeft);
cam2image.copyTo(imageRight);

// 4.表示
cv::imshow("Camera Image", combinedImage);



ちなみに悩んでいたのは、2のところの3番目と4番目の引数を次のように書いていたからです。実行後にエラーがでます。
cv::Mat imageRight(combinedImage, cv::Rect(640, 0, cam2image.cols+640, cam2image.rows));

関数のマニュアルはちゃんと読みましょうって教訓でした。

参考:
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14117591624

2015年8月16日日曜日

OpenCV Mat型 初期化と要素へのアクセス

OpenCVのMat型は、基本的には画像のデータを入れておく型でありながら、行列演算にも使えます。掛け算とか基本的なことはさておき、データの入力方法でかなり悩んでしまったため、このします。

ここで紹介する入力方法は2つ。初期化と要素へのアクセスです。

初期化:
cv::Mat A = cv::Mat(6, 6, CV_64FC1);
double Adata[6][6] = { { 1, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 0, 0, 0 },
{ 0, 0, 1, 0, 0, 0 },
{ 0, 0, 0, 1, 0, 0 },
{ 0, 0, 0, 0, 1, 0 },
{ 0, 0, 0, 0, 0, 1 } };
A = cv::Mat(3, 3, CV_64FC1, Rdata).clone();

注:Cloneの方がミスがなくて確実。遅くなるしメモリ量の問題もあるから注意

要素アクセス:
・1変数の型
変数名.at<型名>(行, 列)

例:代入(double)
cv::Mat A = cv::Mat(3, 1, CV_64FC1);
A.at<double>(0, 0) = (double)1.0;
A.at<double>(1, 0) = (double)1.0;
A.at<double>(2, 0) = (double)1.0;

・各要素がチャンネルなら、
変数名.at<型名>(行, 列)[チャンネルNo]

参考
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12128343222

2015年8月14日金曜日

OpenCV でUSBカメラの画像を表示(Windows 8, Visual Studio 2013)

OpenCVを使ってUSBカメラの表示をしたので紹介。なぜか参考にしたサイトの通りのソースでは動かなく、ちょっと悩んだので紹介。

1. プロジェクトの作成
とりあえず、Consoleプロジェクトで行きましょう。

2. プロパティの設定
プロジェクトのプロパティを開き、
C/C++->Additional Include DirectoriesにOpenCVのインクルードフォルダを追加
Linker->Additional Library DirectoriesにOpenCVのライブラリフォルダを追加
Linker->Input->Additional Dependenciesに以下のファイル名を追加
opencv_core2410d.lib
opencv_highgui2410d.lib
opencv_objdetect2410d.lib

3. Source
#include <iostream>
#include <opencv2\opencv.hpp>
#include <opencv2\highgui\highgui.hpp>

int _tmain(int argc, _TCHAR* argv[])
{
// デフォルトのカメラをオープン
cv::VideoCapture cap(0);
if (!cap.isOpened())
{
std::cerr << "camera cannot open" << std::endl;
return -1;
}

// ウィンドウを作成
cv::namedWindow("cap", CV_WINDOW_AUTOSIZE);

while (1)
{
cv::Mat frame;
// カメラからフレームを取得
cap >> frame;
// ウィンドウに表示
if (frame.size().height != 0 || frame.size().width!=0)
{
cv::imshow("cap", frame);
}

// 30 ms 待つ。キー入力があれば終了
if (cv::waitKey(30) >= 0) break;
}

return 0;
}

ここで、悩んだところは、
if (frame.size().height != 0 || frame.size().width!=0)
この1文。
参考のサイトにはないのだが、調べてみると、最初のフレームではCapからはデータは転送されず画面のサイズが0×0でAbortがでていた。2フレーム目からはちゃんと取得できていたので、ちょっと改造したのがこの1文です。もっといい方法があってり、ミスがあったら教えてください。

参考:
http://docs.opencv.org/3.0-beta/modules/videoio/doc/reading_and_writing_video.html
http://qiita.com/vs4sh/items/4a9ce178f1b2fd26ea30



2015年7月20日月曜日

OpenCV Mat と Eigen の相互変換

覚書として。参考サイトからの引用です。



cv::MatとEigen::Matrixの相互変換

cv::MatからEigen::Matrixへの変換
#include <iostream>
#include <Eigen/Core>
#include <opencv2/core/core.hpp>
#include <opencv2/core/eigen.hpp>

int
main(int argc, char *argv[])
{
  // 3x3, double の行列
  Eigen::Matrix3d eigen_mat;
  eigen_mat << 1.1, 1.2, 1.3,
               2.1, 2.2, 2.3,
               3.1, 3.2, 3.3;
  cv::Mat cv_mat;
  // convert from Eigen::Matrix to cv::Mat
  cv::eigen2cv(eigen_mat, cv_mat);

  std::cout << "cv_mat:\n" << cv_mat << std::endl << std::endl;
  std::cout << "eigen_mat:\n" << eigen_mat << std::endl << std::endl;
}
実行結果:
cv_mat:
[1.1, 1.2, 1.3;
  2.1, 2.2, 2.3;
  3.1, 3.2, 3.3]

eigen_mat:
1.1 1.2 1.3
2.1 2.2 2.3
3.1 3.2 3.3
Eigen::Matrixからcv::Matへの変換
#include <iostream>
#include <Eigen/Core>
#include <opencv2/core/core.hpp>
#include <opencv2/core/eigen.hpp>

int
main(int argc, char *argv[])
{
  // 3x3 の行列
  cv::Mat cv_mat = (cv::Mat_<double>(3,3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);
  Eigen::Matrix<double, 3, 3> eigen_mat1; // コンパイル時に行列サイズが既知の場合
  // convert from cv::Mat to Eigen::Matrix
  cv::cv2eigen(cv_mat, eigen_mat1);

  std::cout << "cv_mat:\n" << cv_mat << std::endl << std::endl;
  std::cout << "eigen_mat1:\n" << eigen_mat1 << std::endl << std::endl;

  Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> eigen_mat2; // 動的な行列
  // convert from cv::Mat to Eigen::Matrix
  cv::cv2eigen(cv_mat, eigen_mat2);
  std::cout << "eigen_mat2:\n" << eigen_mat2 << std::endl << std::endl;
}
実行結果:
cv_mat:
[1, 2, 3;
  4, 5, 6;
  7, 8, 9]

eigen_mat1:
1 2 3
4 5 6
7 8 9

eigen_mat2:
1 2 3
4 5 6
7 8 9

参考
cv::Matの基本処理
http://opencv.jp/cookbook/opencv_mat.html#cv-mateigen-matrix

2015年7月18日土曜日

OpenCV 特徴点検出+マッチング

OpenCVにおけるマッチングは次のプロセスを経て実現されます。

特徴点抽出
  ↓
特徴量記述の計算の実行
  ↓
マッチング

少し突っ込めば、さらに双方向マッチングの実施+マッチング距離の閾値以下の除去があります。それを入れると、

特徴点抽出
  ↓
特徴量記述の計算の実行
  ↓
双方向マッチング
  ↓
マッチング距離の閾値以下の除去

それでは、一気にコードを見てみましょう。(ORBを使用)

// FeatureDetectorオブジェクトの生成
Ptr<FeatureDetector> detector = new ORB(80, 1.25f, 4, 7, 0, 2, 0, 7);

// DescriptionExtractorオブジェクトの生成
Ptr<DescriptorExtractor> extractor = DescriptorExtractor::create("ORB");

// DescriptorMatcherオブジェクトの生成
Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce-Hamming");

// 特徴点情報を格納するための変数
vector<KeyPoint> keypoints1;
vector<KeyPoint> keypoints2;

// Extract feature points
detector->detect(img1, keypoints1);
detector->detect(img2, keypoints2);

// 画像の特徴情報を格納するための変数
Mat descriptor1;
Mat descriptor2;

// compute the feature discriptor
extractor->compute(img1, keypoints1, descriptor1);
extractor->compute(img2, keypoints2, descriptor2);

// 特徴点のマッチング情報を格納する変数
vector<DMatch> dmatch;

// compute matching
matcher->match(descriptor1, descriptor2, dmatch);

// Extract matching which has high matching rate
int count = dmatch.size();
int matchCount = 0;

double min_dist = DBL_MAX;
for (int i = 0; i < (int)dmatch.size(); i++) { // Acquire the minimum distance
double dist = dmatch[i].distance;

if (dist < min_dist) {
min_dist = dist;
}
}
if (min_dist < 1.0)
{
min_dist = 1.0;
}

double threshold = 30; // Fixed value is better than value times min_dist

for (int i = 0; i < (int)dmatch.size(); i++) {
if (dmatch[i].distance < threshold) {
matchCount++;

dmatchClose.push_back(dmatch[i]);
}
//std::cout << dmatch[i].distance << "\t" << min_dist << "\t" << threshold << std::endl;
}




参考:
OpenCVで画像の特徴抽出・マッチングを行う
http://whoopsidaisies.hatenablog.com/entry/2013/12/07/135810
OpenCVでのORBによる特徴点抽出とマッチング(その1)基本的な使い方
http://independence-sys.net/main/?p=2632

OpenGLでGLUTを使って2つのウィンドウを制御する①
http://blog.goo.ne.jp/omty/e/c8a5aee50e3918a1ad669472ec25e462
サブウィンドウ
http://seesaawiki.jp/w/mikk_ni3_92/d/%c8%af%c5%b8%ca%d403

PixelBufferObject
http://seesaawiki.jp/w/mikk_ni3_92/d/PixelBufferObject

Visual Studioでデバッグ時にOpenCVのMat等の画像を表示できるプラグインが便利
http://whoopsidaisies.hatenablog.com/entry/2014/11/28/175637



OpenCV イメージデータ(Mat)のコピー(クローン)

OpenCVのイメージデータをコピーしようとしたら、できない?なんでと思って結構悩んでしまいました。よく考えてみると当たり前なのですが。

そもそも、OpenCV のMat型というのものは、次のようになっている(結構略)。
サイズとかデータの型の情報:実体
画像のデータ:ポインタ

はぅ!!画像のデータも実体で入っているものとばかり思い込んでいた。

ということで本題。

void func(cv::Mat getImage){
    static cv::Mat imageInFunc;
    imageInFunc=getImage;
    return;
}

ってな感じで書いても、ポインタを代入しているだけなのでデータは保存されていない。元のデータが書き変われば、imageInFuncを表示させてみても、データは書き換わり続ける。

で、どうすればいいかというと。cloneってものがあるのね。

void func(cv::Mat getImage){
    static cv::Mat imageInFunc;
    imageInFunc=getImage.clone;
    return;
}

で解決。あほなことに2時間ほど費やしてしまった。

参考:
OpenCVでまずやること『Mat』
知っておきたいMatのゴリ知識
cv::Matの基本処理

2015年7月7日火曜日

Mastering OpenCV wtih Practical Computer Vision Projects のサンプルソース

いわずとしれた、OpenCVは便利な代物。でも、いろいろありすぎて、何ができるかわからない。あーんど、関数・クラスは存在するが使い方がわからんものが多い。

ってことで本を買いました。

Mastering OpenCV wtih Practical Computer Vision Projects

中身は結構いいので、それは別途紹介するとして、サンプルソース集を見つけました。なぜこれがいるかといえば、解りやすいのだけど、打ち込むのが面倒なだけです。

GitHubにありました。著者の一人が公開。
https://github.com/MasteringOpenCV/code

2015年7月1日水曜日

CMakeList.txt の設定 (Visual studio 2013 + OpenGL & OpenCV & Eigen)

cmakeをつくるのに苦労したので、その記録。初心者だー
今作っているプログラムは、OpenGL & OpenCV & Eigenを使っています。それらのCmakeの作り方はそれぞれ違っていので、いろいろと参考になるねーってことでまとめ。また、私の環境はいろいろ制限(インストール不可+特定フォルダにアクセス不可)されているので、OpenGLはふつうはこんなことしなくてもいいかも。また、この理由によりパスは私の使っているものなので、自由に変更してほしい。変更するところだけ太字にしておく。

1.OpenCV
Windowsで自前でOpenCVをコンパイルした時にはCmakeはそのフォルダをわかってくれない。そのためOpenCV_DIRで場所をしていしてあげる。

ーーーーーCMakeList.txtの中身ーーーーー
# OpenCVインストールパスを指定
set(OpenCV_DIR "C:/dev/opencv-2.4.10/build/install")

# OpenCVのパッケージを探す
find_package(OpenCV REQUIRED)

# OpenCVが見つかった場合のみ設定を行う
if(OpenCV_FOUND)
  # インクルードパスを指定
  include_directories(${OpenCV_INCLUDE_DIRS})

  # リンクするライブラリ指定
  target_link_libraries(platform ${OpenCV_LIBS})
endif(OpenCV_FOUND)

2.Eigen
Eigenはインクルードのみで使えるライブラリなのでそのパスだけを指定してあげる。

ーーーーーCMakeList.txtの中身ーーーーー
# Eigen
include_directories("C:/dev/eigen-3.2.4")

3.OpenGL
なぜかこれをかなり苦労した。freeglutをダウンロードしてコンパイルして使っているのだが、フォルダ構成が違うせいかOpenCVと同じ方法をとっても何か上手くいかない。そのため、どうせ使うのはfreeglut.libとインクルードだけなので直接指定した。Cmakeの利点が消えている気がするがまぁいい。いつかいいことあるだろう。

ーーーーーCMakeList.txtの中身ーーーーー
# OpenCVのパッケージを探す
find_package(OpenGL REQUIRED)
include_directories("D:/twatanabe8/dev/freeglut-2.8.1/include")

target_link_libraries(platform "D:/twatanabe8/dev/freeglut-2.8.1/lib/x64/freeglut.lib")

2015年6月30日火曜日

OpenGL 取得した画像をOpenCVで処理してOpenGLで表示する。

内部でSimulationをするために、OpenGLでレンダリングし、その画像を取得しOpenCVで処理することを考えた。まぁ、一般的だと思う。そのためには、

1.OpenGLから画像情報の取得
画像情報の取得には3つ方法がある。
・OpenGLで画像を表示させ、glReadPixels を使って画像情報を取得
・ビデオメモリからWindowの画像情報を取得
・オフスクリーンレンダリング
・ダブルバッファから画像情報の取得
下の3つはまだ試していないので今後にやったらご紹介するとして、1つ目が一番簡単なのでその手法を採用した。

仮のコード(double bufferを使うコードから取得)
cv::Mat ReadDisplay;

glutSwapBuffers();
glReadPixels(0, 0, WIDTH, HEIGHT, GL_BGR_EXT, GL_UNSIGNED_BYTE, ReadDisplay.data);

2.画像を上下反転
OpenGLの座標系のY軸は上向きが正。OpenCVの座標系のY軸は下向きが正(左上が原点)。これを変換する必要がある。

cv::flip(ReadDisplay, ReadDisplay, 0);

3.なんか処理する。
特徴点抽出でもやりましょう。でも、本題でないため細かくは略します。ほしかったら連絡ください。
detector = new ORB(80, 1.25f, 4, 7, 0, 2, 0, 7);
detector->detect(img1, keypoints);
cv::drawKeypoints(img1, keypoints, output);

4.OpenCV 色の変更
なぜだかわからないけど、OpenCVはBGR らしい。そのため、BGRから RGB変更しましょう。

cv::cvtColor(output, output, CV_BGR2RGB);

これをやらないとセピア色になります。

5. 画像を上下反転
OpenGLで表示するために、また画像を上下反転します。

cv::flip(output, output, 0);

6.OpenGLのテクスチャに張り付けて、GLのWindowに画像を表示する。
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glOrtho(0.0, WIDTH, HEIGHT, 0.0, -1.0, 1.0);

glEnable(GL_TEXTURE_2D);//テクスチャ有効
//glBindTexture(GL_TEXTURE_2D, img.data);

/* テクスチャ画像はバイト単位に詰め込まれている */
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
/* テクスチャの割り当て */
glTexImage2D(GL_TEXTURE_2D, 0, 3, img.cols, img.rows, 0, GL_RGB, GL_UNSIGNED_BYTE, img.data);
/* テクスチャを拡大・縮小する方法の指定 */
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

glEnable(GL_ALPHA_TEST);//アルファテスト開始
glBegin(GL_POLYGON);
glTexCoord2f(0.0f, 0.0f); glVertex2d(0, HEIGHT);//左下
glTexCoord2f(0.0f, 1.0f); glVertex2d(0, 0);//左上
glTexCoord2f(1.0f, 1.0f); glVertex2d(WIDTH, 0);//右上
glTexCoord2f(1.0f, 0.0f); glVertex2d(WIDTH, HEIGHT);//右下
glEnd();
glDisable(GL_ALPHA_TEST);//アルファテスト終了
glDisable(GL_TEXTURE_2D);//テクスチャ無効

glutSwapBuffers();

参考:
OpenGL描画→OpenCV処理→ピクチャボックス描画
http://ameblo.jp/morimoridiary/theme-10081830227.html
C++/CLI フォームアプリとOpenCVの連携(cv::Mat)
http://ameblo.jp/morimoridiary/entry-11879119909.html
【1. OpenGL画像をOpenCV画像(cv::Mat)に変換】
http://ameblo.jp/morimoridiary/entry-11879119909.html
Kinect for Windows SDKによる3次元ポイントクラウド
http://kassymemo.blogspot.com/2012/04/kinect-for-windows-sdk3.html
http://whoopsidaisies.hatenablog.com/entry/2014/08/20/200215

2015年6月28日日曜日

OpenCVのインストール (Windows 8 & Visual Studio 2013)

OpenCVはVersionが3.0系が出ている。2系との違いは下記HPがわかりやすかったので、そちらを参照。
OpenCV3.0.0-alphaの特徴抽出・マッチングまとめ

結果、大きな違いの一つは特徴点抽出のインターフェースが違うことみたいだ。私の場合、基本からやりたかったので、最初から(追加をいれなくても)SIFTやSURFが使える2.4.10にした。以降、2.4.9を前提にインストールの手順を進める。

1.OpenCV公式パッケージの入手とインストール
公式ページからダウンロード。今回は、2.4.10。
展開する。展開場所はどこでもよいが、参考したページに従い、C:\dev\ にした。
パスにスペースが入ると動かいソフトもあるので、これがよいだろう。

2.環境変数に追加
C:\dev\opencv-2.4.10\opencv\build\x64\vc12\bin
ちゃんと追加されているか確認するために、commandを立ち上げて、「opencv_traincascade.exe」とでも打ち込み、エラーが表示されなければよいだろう。上手くいけば、引数が足りないといわれヘルプがでるだけ。

3.Visual Studio Project ファイルの設定
・インクルードパス
ソリューションエクスプローラーのプロジェクト名を右クリックし、プロパティを立ち上げる。
構成プロパティ->C/C++
 追加のインクルードディレクトリに下記を追加
 C:\dev\opencv-2.4.10\opencv\build\include

・ライブラリパス
ソリューションエクスプローラーのプロジェクト名を右クリックし、プロパティを立ち上げる。
構成プロパティ->リンカー
 追加のライブラリディレクトリに下記を追加
 C:\dev\opencv-2.4.10\opencv\build\x64\vc12\lib

・使用ライブラリの指定
ソリューションエクスプローラーのプロジェクト名を右クリックし、プロパティを立ち上げる。
構成をDebug若しくはReleaseにして、構成プロパティ->リンカー->入力
 追加の依存に下記を追加(下はDebugの時)
opencv_core2410d.lib
opencv_highgui2410d.lib
何のライブラリが必要かは、下の表見てね。(OpenCV入門(1)より)
(まぁ、cmakeを使えば勝手に集めてくれるが、執筆時点Cmakeが上手く動いてくれないので、直接入れている。)

モジュール名ライブラリ名(OpenCV 3.0)概要
coreopencv_core300.lib画像・行列データ構造の提供、配列操作、図形描画、XMLおよびYAML入出力、コマンドラインパーサー、ユーティリティ機能など
imgprocopencv_imgproc300.libフィルター処理、アフィン変換、エッジ検出、ハフ検出、色変換、ヒストグラム計算、ラベリングなど
calib3dopencv_calib3d300.libカメラキャリブレーション、ステレオ対応点探索
features2dopencv_features2d300.lib特徴点抽出(ORB、BRISK、FREAKなど)
highguiopencv_highgui2d300.libGUI(ウィンドウ表示、画像ファイル、動画ファイルの入出力、カメラキャプチャなど)
mlopencv_ml300.libSVM、決定木、ブースティング、ニューラルネットワークなど
cudaopencv_cuda300.lib画像処理のCUDA(GPGPU)実装
objdetectopencv_objdetect300.libオブジェクト検出(顔検出、人体検出など)
photoopencv_photo300.lib画像修復、ノイズ除去処理、HDR(High Dynamic Range)合成、画像合成など
shapeopencv_shape300.lib形状マッチング
stitchingopencv_stitching300.libパノラマ合成
superresopencv_superres300.lib超解像処理
videoopencv_video300.libオプティカルフロー、カルマンフィルタ、背景差分など
vizopencv_viz300.lib3Dデータの可視化(内部的にVTKを使用)
nonfreeopencv_nonfree300.lib一部の国で特許が取得されている、もしくは使用に制限がある可能性があるアルゴリズム(SIFT、SURF)
                                   主要モジュールとその機能概要

注意:Debugでやっているときは *d.libが必要となるので注意。Releaseのときはdがつかないやつを追加。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
教訓
最初は最新版が使いたくてVisual Studio 2015で挑戦していたが、どうしてもうまくいかない。どこが上手くいかないかというと、コンパイルは通るのだが、実際に動かす段階でDLLの参照(特徴点抽出)でエラーがでる。どうやら、原因は2つ。
1.Visual Studio 2013 と 2015のc++のコンパイラは異なる。
2.OpenCVは異なるコンパイラから生成されたDLLを用いると、使う関数(これ重要)によってはエラーがでる。最低限動かすだけならでないこともある。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
参考:
OpenCVのインストール
http://www.buildinsider.net/small/opencv/02