私は最近、このコードを使用して、そこにいくつのマーチングポイントがあるかを示しました。 しかし、それは動作しません。なぜ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:ありがとうございます!
print pic_name [i]またはデバッガを使用して、その内容を確認してください –