2017-05-10 7 views
0

私は最近、このコードを使用して、そこにいくつのマーチングポイントがあるかを示しました。 しかし、それは動作しません。なぜimread(pic_name [i]、1)が機能しないのですか?

私は問題を知っていますが、私はimread()を心配して使用しています。このような :

Mat srcImage2 = imread(pic_name[i],1); 

しかし、私は2枚のJPG画像をロードする私のコードをしようとした場合、それは動作します。 このように:

Mat srcImage2 = imread("2.jpg",1); 

私を助けてください。 QwQ。 以下に完全なコードがあります。

#include <opencv2/core/core.hpp> 
    #include <opencv2/features2d/features2d.hpp> 
    #include "opencv2/highgui/highgui.hpp" 
    #include "opencv2/calib3d/calib3d.hpp" 
    #include "opencv2/nonfree/nonfree.hpp" 
    #include <iostream> 
    #include <fstream> 
    using namespace cv; 
    using namespace std; 

    vector<string>& split_input(string& c, vector<string>& filename); 

    int main(){ 

     vector<string> pic_name; 
     ifstream infile("PicName.txt"); 
     string c; 

     while (getline(infile, c)) split_input(c, pic_name); 
     infile.close(); 
     for (int i(0);i<pic_name.size(); ++i) { 
      Mat srcImage1 = imread("1.jpg", 1); 
      Mat srcImage2 = imread(pic_name[i],1); 
      if (!srcImage1.data || !srcImage2.data) 
      { 
       printf("ERROR,cant find picture. \n"); return false; 
      } 

      int minHessian = 9000; 
      SurfFeatureDetector detector(minHessian); 
      vector<KeyPoint> keypoints_object, keypoints_scene; 

      detector.detect(srcImage1, keypoints_object); 
      detector.detect(srcImage2, keypoints_scene); 

      //featres 
      SurfDescriptorExtractor extractor; 
      Mat descriptors_object, descriptors_scene; 
      extractor.compute(srcImage1, keypoints_object, descriptors_object); 
      extractor.compute(srcImage2, keypoints_scene, descriptors_scene); 

      //FLANN 
      FlannBasedMatcher matcher; 
      vector<DMatch> matches; 

      if (descriptors_object.empty()) 
       cvError(0, "MatchFinder", "1st descriptor empty", __FILE__, __LINE__); 
      if (descriptors_scene.empty()) 
       cvError(0, "MatchFinder", "2nd descriptor empty", __FILE__, __LINE__); 

      matcher.match(descriptors_object, descriptors_scene, matches); 
      double max_dist = 0; double min_dist = 100; 

      for (int i = 0; i < descriptors_object.rows; i++) 
      { 
       double dist = matches[i].distance; 
       if (dist < min_dist) min_dist = dist; 
       if (dist > max_dist) max_dist = dist; 
      } 

      printf(">Max dist : %f \n", max_dist); 
      printf(">Min dist : %f \n", min_dist); 

      std::vector<DMatch> good_matches; 
      for (int i = 0; i < descriptors_object.rows; i++) 
      { 
       if (matches[i].distance < 3 * min_dist) 
       { 
        good_matches.push_back(matches[i]); 
       } 
      } 
      cout << "points:" << good_matches.size() << endl << endl; 

vector<string>& split_input(string& c, vector<string>& filename) { 
    string::size_type i(0); 
    int flag(0); 
    while (i != c.size()) { 
     for (; i != c.size() && isspace(c[i]); ++i); 
     string::size_type j = i; 
     for (; j != c.size() && !isspace(c[j]); ++j); 
     filename.push_back(c.substr(i, j - i)); 
     i = j; 
    } 
    return filename; 
} 

PS:PicName.txtには「2.jpg 3.jpg」という単なるオンラインがあります。 PPS:ありがとうございます!

+0

print pic_name [i]またはデバッガを使用して、その内容を確認してください –

答えて

0

あなたは、ファイルの読み取りに問題があり、コードが動作していない理由です、代わりにしてみてください:

std::ifstream infile("foo.txt"); 
std::string a; 
std::string b; 
while (infile >> a >> b) 
Mat srcImage1 = imread(a, 1); 
Mat srcImage2 = imread(b, 1); 

が編集:

std::ifstream infile("foo.txt"); 
std::string a; 

std::vector<std::string> v; 
while (infile >> a) 
{ 
    v.push_back(a); 
} 
if(v.size()!=2) return -1; 
Mat srcImage1 = imread(v[0]); 
Mat srcImage2 = imread(v[1]); 

次のようなベクターを使用することができます

enter image description here

+0

どのようにベクトルまたは配列を引数として使用できますか?方法はありますか? – ArCherno

+1

'v.size()> = 2u'をチェックするまで、' v [0] 'や' v [1] 'にアクセスしないでください! (また、最初の提案では、読み込みが失敗するまで 'b'を使用しないことに注意してください。ブロックの最後の2つの文をグループ化するのですか?) –

+0

ありがとう! Umm ... _(:π∠)_実際には、入力ファイルには複数の画像が含まれています。私はちょうどこのコードが正しい場合は試したいので、私はこのファイルに2つの画像を追加します。それに10ピクチャがあります。なぜベクトルを使用したいのですが、なぜimread()でv [i]を使用できないのですか、それは違法ですか?私は初心者です。これが愚かな質問だったら、申し訳ありません。 – ArCherno

関連する問題