Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在OpenCV中从要素关键点手动进行成对匹配_Opencv_Matching_Feature Detection_Surf - Fatal编程技术网

在OpenCV中从要素关键点手动进行成对匹配

在OpenCV中从要素关键点手动进行成对匹配,opencv,matching,feature-detection,surf,Opencv,Matching,Feature Detection,Surf,这是我的问题。我用SURF在多幅图像上手动提取关键点特征。但我也已经知道哪一对分数会匹配。问题是,我正在尝试创建匹配对,但我不知道如何创建。我试着看代码,但它是一团乱 现在,我知道features.descriptor(矩阵)的大小与关键点的数量相同(另一个维度是1)。在代码中,为了检测匹配对,它只使用描述符,因此它比较行(或列,我不确定)或两个描述符矩阵,并确定是否有任何共同点 但在我的例子中,我已经知道在图1中的关键点I和图2中的关键点j之间存在匹配。如何将其描述为MatchesInfo值。

这是我的问题。我用SURF在多幅图像上手动提取关键点特征。但我也已经知道哪一对分数会匹配。问题是,我正在尝试创建匹配对,但我不知道如何创建。我试着看代码,但它是一团乱

现在,我知道features.descriptor(矩阵)的大小与关键点的数量相同(另一个维度是1)。在代码中,为了检测匹配对,它只使用描述符,因此它比较行(或列,我不确定)或两个描述符矩阵,并确定是否有任何共同点

但在我的例子中,我已经知道在图1中的关键点I和图2中的关键点j之间存在匹配。如何将其描述为MatchesInfo值。尤其是std::vector类型的元素匹配


编辑:所以,对于这个,我不需要使用任何匹配器或类似的东西。我知道哪对组合在一起

如果我正确理解您的问题,我假设您希望在
std::vector
中匹配关键点,以便使用OpenCV
cv::drawMatches
或使用类似的OpenCV函数来绘制它们。由于我最近也在“手工”进行匹配,下面是我的代码,它绘制了原始包含在
std::vector aMatches
中的任意匹配,并在窗口中显示它们:

const cv::Mat& pic1 = img_1_var;
const cv::Mat& pic2 = img_2_var;
const std::vector <cv::KeyPoint> &feats1 = img_1_feats;
const std::vector <cv::KeyPoint> &feats2 = img_2_feats;
    // you of course can work directly with original objects
    // but for drawing you only need const references to
    // images & their corresponding extracted feats

std::vector <std::pair <int, int> > aMatches;
    // fill aMatches manually - one entry is a pair consisting of
    //      (index_in_img_1_feats, index_in_img_2_feats)


// the next code draws the matches:
std::vector <cv::DMatch> matches;
matches.reserve((int)aMatches.size());

for (int i=0; i < (int)aMatches.size(); ++i)
    matches.push_back(cv::DMatch(aMatches[i].first, aMatches[i].second,
                      std::numeric_limits<float>::max()));

cv::Mat output;

cv::drawMatches(pic1, feats1, pic2, feats2, matches, output);

cv::namedWindow("Match", 0);
cv::setWindowProperty("Match", CV_WINDOW_FULLSCREEN, 1);
cv::imshow("Match", output);    
cv::waitKey();
cv::destroyWindow("Match");
const cv::Mat&pic1=img_1_var;
常数cv::Mat&pic2=img_2_var;
常数std::vector&feats1=img_1_feats;
常数std::vector&feats2=img_2_feats;
//当然,您可以直接使用原始对象
//但对于绘图,您只需要常量引用即可
//图像及其相应的提取技巧
std::矢量匹配;
//手动填写a匹配项-一个条目是一对,由
//(1号专长中的索引,2号专长中的索引)
//下一个代码将绘制匹配项:
向量匹配;
matches.reserve((int)aMatches.size());
对于(int i=0;i<(int)aMatches.size();++i)
matches.push_back(cv::DMatch(aMatches[i])。首先,aMatches[i]。第二,
std::numeric_limits::max());
cv::Mat输出;
cv::drawMatches(pic1,feats1,pic2,feats2,matches,output);
cv::namedWindow(“匹配”,0);
cv::setWindowProperty(“匹配”,cv_窗口_全屏,1);
cv::imshow(“匹配”,输出);
cv::waitKey();
cv::破坏窗口(“匹配”);
或者,如果出于比绘图更复杂的目的需要有关匹配的更完整信息,则可能还需要将匹配之间的距离设置为适当的值。例如,如果要使用L2距离计算距离,应替换以下行:

for (int i=0; i < (int)aMatches.size(); ++i)
    matches.push_back(cv::DMatch(aMatches[i].first, aMatches[i].second,
                      std::numeric_limits<float>::max()));
for(int i=0;i<(int)aMatches.size();++i)
matches.push_back(cv::DMatch(aMatches[i])。首先,aMatches[i]。第二,
std::numeric_limits::max());
因此(注意,对于这一点,还需要参考特征描述符向量):

cv::L2-cmp;
const std::vector&desc1=img\u 1\u feats\u描述符;
const std::vector&desc2=img\u 2\u特征描述符;
对于(int i=0;i<(int)aMatches.size();++i){
float*firstFeat=&desc1[aMatches[i].first];
float*secondFeat=&desc2[aMatches[i].second];
浮动距离=cmp(第一个专长,第二个专长,第一个专长->大小());
matches.push_back(cv::DMatch(aMatches[i])。首先,aMatches[i]。第二,
距离);
}

请注意,在最后一个代码段中,
descX[i]
featsX[i]
的描述符,内部向量的每个元素都是描述符向量的一个组件。另外,请注意,所有描述符向量都应该具有相同的维度。

为了将来的参考,您应该尽量让问题更清楚。我的示例基于“我知道哪些对在一起”和“std::vector”。如果您需要对答案进行任何进一步的澄清,请尝试更精确地回答问题。我的描述符是cv::Mat类型的,如何将它们转换为向量?还是可以自然转换?
cv::L2<float> cmp;

const std::vector <std::vector <float> > &desc1 = img_1_feats_descriptors;
const std::vector <std::vector <float> > &desc2 = img_2_feats_descriptors;

for (int i=0; i < (int)aMatches.size(); ++i){
    float *firstFeat = &desc1[aMatches[i].first];
    float *secondFeat = &desc2[aMatches[i].second];
    float distance = cmp(firstFeat, secondFeat, firstFeat->size());
    matches.push_back(cv::DMatch(aMatches[i].first, aMatches[i].second,
                      distance));
}