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

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

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

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

OpenCV

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

C++

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

Q&A

解決済

3回答

9977閲覧

OpenCVによる画像マッチング

stdnium

総合スコア15

Visual Studio

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

OpenCV

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

C++

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

0グッド

0クリップ

投稿2017/10/26 21:08

編集2017/10/30 03:20

###前提・実現したいこと
VisualStudio15 2017上でOpenCVを動かし、SIFT特徴量を用いた画像マッチングに取り組もうと思っています。
しかし、コンパイルで以下のエラーが発生し解決策が見つからず困っている状況です。

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

・エラーメッセージ namespace "cv" にメンバー "initModule_nonfree" がありません class "cv::Feature2D" にメンバー "create" がありません class "cv::Feature2D" にメンバー "create" がありません

###該当のソースコード

C++

1#include <opencv2/opencv.hpp> 2#include <opencv2/xfeatures2d/nonfree.hpp> // SIFT・SURFモジュール用 3 4void FeatureMatching( 5 const std::string& lenna, // 画像1のファイル名 6 const std::string& lenna2, // 画像2のファイル名 7 const std::string& STAR, // detectorType 8 const std::string& FREAK, // descriptorExtractorType 9 const std::string& MATCH, // descriptorMatcherType 10 bool crossCheck = true) // マッチング結果をクロスチェックするかどうか 11{ 12 // 画像の読み込み 13 cv::Mat img1 = cv::imread("C:\opencv\image\lenna.jpg"); 14 cv::Mat img2 = cv::imread("C:\opencv\image\lenna2.jpg"); 15 16 // SIFT・SURFモジュールの初期化 17 cv::initModule_nonfree(); 18 19 // 特徴点抽出 20 cv::Ptr<cv::FeatureDetector> detector = cv::FeatureDetector::create("STAR"); 21 std::vector<cv::KeyPoint> keypoint1, keypoint2; 22 detector->detect(img1, keypoint1); 23 detector->detect(img2, keypoint2); 24 25 // 特徴記述 26 cv::Ptr<cv::DescriptorExtractor> extractor = cv::DescriptorExtractor::create("FREAK"); 27 cv::Mat descriptor1, descriptor2; 28 extractor->compute(img1, keypoint1, descriptor1); 29 extractor->compute(img2, keypoint2, descriptor2); 30 31 // マッチング 32 cv::Ptr<cv::DescriptorMatcher> matcher = cv::DescriptorMatcher::create("MATCH"); 33 std::vector<cv::DMatch> dmatch; 34 if (crossCheck) 35 { 36 // クロスチェックする場合 37 std::vector<cv::DMatch> match12, match21; 38 matcher->match(descriptor1, descriptor2, match12); 39 matcher->match(descriptor2, descriptor1, match21); 40 for (size_t i = 0; i < match12.size(); i++) 41 { 42 cv::DMatch forward = match12[i]; 43 cv::DMatch backward = match21[forward.trainIdx]; 44 if (backward.trainIdx == forward.queryIdx) 45 dmatch.push_back(forward); 46 } 47 } 48 else 49 { 50 // クロスチェックしない場合 51 matcher->match(descriptor1, descriptor2, dmatch); 52 } 53 54 // マッチング結果の表示 55 cv::Mat out; 56 cv::drawMatches(img1, keypoint1, img2, keypoint2, dmatch, out); 57 cv::imshow("matching", out); 58 while (cv::waitKey(1) == -1); 59}

###試したこと
OpenCVのソースをCmakeでコンパイルし導入。
(参照サイト:https://qiita.com/tomochiii/items/fa26404ebc5fcd4481b9)
(contrib\moduleのパスも設定済)

さらに別サイト(http://whoopsidaisies.hatenablog.com/entry/2013/12/07/135810)を参考にソースコードを入力し、OpenCV3以降の仕様変更に合わせ
"#include <opencv2/nonfree/nonfree.hpp>"
の部分を
"#include <opencv2/xfeatures2d/nonfree.hpp>"
に変更しました。
また、元のソースコードのfilename1,filename2,featureDetectorName,descriptorExtractorName,descriptorMatcherNameに何かしらの入力が必要かと思い、それぞれ適当な文字列を入力しました。

###補足情報(言語/FW/ツール等のバージョンなど)
VisualStudio15 2017
OpenCV 3.2.0
(OpenCV 3.1.0でも試したところ同エラーにより動かず)

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

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

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

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

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

guest

回答3

0

こんにちは。

SHIFTやSURF等の特許が絡むようなものはどうやらcontribに移動しているようです。(OpenCV3.0.0-alphaの特徴抽出・マッチングまとめ
↓が参考になりそうです。
Visual Studio 2017にOpenCV3.2.0とopencv_contribを導入する方法

投稿2017/10/27 02:18

Chironian

総合スコア23272

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

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

stdnium

2017/10/30 03:16

contribを導入しmoduleのパスも設定済でした。 OpenCVが3.1.0だったため、サイトを参照し3.2.0を導入し試してみましたが同じエラーが出て動かず…でした。
Chironian

2017/10/30 03:58

ということは、ヘッダのパス以外にも変更点があるということになります。 その変更点を知っている人がここで回答してくれれば良いのですが、ごめんなさい、私は把握していません。 回答が得られない場合は、その変更点を何らかの方法(OpenCVの変更来歴や解説サイトを探す、OpenCVのソースを読むなど)で見つけるか、動作することが分かっているOpenCVの古いバージョンでやってみるのが常套手段と思います。
guest

0

ベストアンサー

OpenCV3.1では、次のコードで動作しました。

C++

1#include <opencv2/opencv.hpp> 2#include <opencv2/xfeatures2d.hpp> 3#include <opencv2/xfeatures2d/nonfree.hpp> // SIFT・SURFモジュール用 4 5void FeatureMatching(void) 6{ 7 // 画像の読み込み 8 cv::Mat img1 = cv::imread(R"(C:\Users\MyName\Pictures\Lenna.png)"); 9 cv::Mat img2 = cv::imread(R"(C:\Users\MyName\Pictures\Lenna.png)"); 10 11 // 特徴点抽出 12 auto detector = cv::xfeatures2d::StarDetector::create(); 13 std::vector<cv::KeyPoint> keypoint1, keypoint2; 14 detector->detect(img1, keypoint1); 15 detector->detect(img2, keypoint2); 16 17 // 特徴記述 18 auto extractor = cv::xfeatures2d::FREAK::create(); 19 cv::Mat descriptor1, descriptor2; 20 extractor->compute(img1, keypoint1, descriptor1); 21 extractor->compute(img2, keypoint2, descriptor2); 22 23 // マッチング 24 auto matcher = cv::DescriptorMatcher::create("BruteForce-L1"); 25 std::vector<cv::DMatch> dmatch; 26 if (true) 27 { 28 // クロスチェックする場合 29 std::vector<cv::DMatch> match12, match21; 30 matcher->match(descriptor1, descriptor2, match12); 31 matcher->match(descriptor2, descriptor1, match21); 32 for (size_t i = 0; i < match12.size(); i++) 33 { 34 cv::DMatch forward = match12[i]; 35 cv::DMatch backward = match21[forward.trainIdx]; 36 if (backward.trainIdx == forward.queryIdx) 37 dmatch.push_back(forward); 38 } 39 } 40 else 41 { 42 // クロスチェックしない場合 43 matcher->match(descriptor1, descriptor2, dmatch); 44 } 45 46 // マッチング結果の表示 47 cv::Mat out; 48 cv::drawMatches(img1, keypoint1, img2, keypoint2, dmatch, out); 49 cv::imshow("matching", out); 50 while (cv::waitKey(1) == -1); 51} 52 53int main(void) { 54 FeatureMatching(); 55 return 0; 56}

リファレンス実装を漁っていたらなんとなく動きました。
SIFTも試してみましたが、initModule_nonfreeはやはり不要なようです。

投稿2017/10/30 04:40

LouiS0616

総合スコア35658

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

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

stdnium

2017/11/06 13:49

ご回答ありがとうございます。 上記のソースコードでビルドしてみたところ、 LNK2001 外部シンボル ""void __cdecl cv::imshow(class cv::String const &,class cv::_InputArray const &)" (?imshow@cv@@YAXAEBVString@1@AEBV_InputArray@1@@Z)" は未解決です。 なるエラーを吐きました。 VisualStudioのバージョンは2017、OpenCVのバージョンは3.1.0です。 もし解決方法がわかれば教えて頂きたいです。
LouiS0616

2017/11/06 13:51

追加の依存ファイルにopencv_highgui310.libかopencv_highgui310d.libを足してください。 前者がリリースモード、後者がデバッグモードに対応します。
stdnium

2017/11/06 16:24

お陰様でビルドに成功しました。 ご丁寧にありがとうございます。 続けて申し訳ないのですが、デバッグを行うと、 ハンドルされない例外が 0x00007FFB4CB69E08 で発生しました (Project.exe 内): Microsoft C++ の例外: cv::Exception (メモリの場所 0x00000086804FE340)。 が発生しました といったエラーが出てプログラムの動作が止まってしまいます。 この解決方法についてご教授頂けないでしょうか。 よろしくお願いします。
stdnium

2017/11/06 16:28

コメントアウトで確認した結果、//特徴記述 以降で発生しています。
stdnium

2017/11/06 16:36

度々の追記失礼いたします。 extractor->compute(img1, keypoint1, descriptor1); で躓いているようです。
LouiS0616

2017/11/06 17:02

画像は確かに二枚とも開けていますか?
stdnium

2017/11/06 17:05

cv::imshowを挿入し表示してみたところ、img1,img2は二枚とも無事表示できました。
LouiS0616

2017/11/06 17:10

記述子の生成に失敗しているように思います。とりあえずFREAK以外を試してみてください。
stdnium

2017/11/06 17:16

FREAKをSIFTに変更すると動きました…! テストプログラムであり、今後FREAKを使う予定はないので問題解決です。 ご親切にありがとうございました。BAにさせて頂きます。
LouiS0616

2017/11/07 00:44

うまくいったようで良かったです。頑張ってくださいね。
guest

0

もしかして: cmakeした時にBUILD_opencv_nonfreeOFFになっていた

投稿2017/10/27 01:53

yumetodo

総合スコア5850

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

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

stdnium

2017/10/27 04:20

ご回答ありがとうございます。 只今Cmakeを確認してみたところ、BUILD_opencv_nonfreeなる項目が存在しませんでした…。
yumetodo

2017/10/27 04:28

おおっと、古い情報だった、失礼
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問