首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我只想得到高质量的特征点

我只想得到高质量的特征点
EN

Stack Overflow用户
提问于 2018-07-02 04:12:10
回答 1查看 110关注 0票数 2

我目前正在使用QT创建者中的c++ OpenCV3.4.0进行实时特性匹配。

我的代码匹配功能之间的第一帧,我得到的网络摄像头和当前的帧输入从网络摄像头。

代码语言:javascript
运行
复制
Mat frame1, frame2, img1, img2, img1_gray, img2_gray;
int n = 0;
VideoCapture cap1(0);
namedWindow("Video Capture1", WINDOW_NORMAL);
namedWindow("Reference img", WINDOW_NORMAL);
namedWindow("matches1", WINDOW_NORMAL);

moveWindow("Video Capture1",50, 0);
moveWindow("Reference img",50, 100);
moveWindow("matches1",100,100);



while((char)waitKey(1)!='q'){
       //raw image saved in frame
       cap1>>frame1;

       n=n+1;
       if (n ==1){
           imwrite("frame1.jpg",  frame1);
           cout<<"First frame saved as 'frame1'!!"<<endl;
       }
       if(frame1.empty())
       break;


       imshow("Video Capture1",frame1);

       img1 = imread("frame1.jpg");
       img2 = frame1;

       cvtColor(img1, img1_gray, cv::COLOR_BGR2GRAY);
       cvtColor(img2, img2_gray, cv::COLOR_BGR2GRAY);

       imshow("Reference img",img1);

       // detecting keypoints
       int minHessian = 400;
       Ptr<Feature2D> detector = xfeatures2d::SurfFeatureDetector::create();
       vector<KeyPoint> keypoints1, keypoints2;
       detector->detect(img1_gray,keypoints1);
       detector->detect(img2_gray,keypoints2);

       // computing descriptors
       Ptr<DescriptorExtractor> extractor = xfeatures2d::SurfFeatureDetector::create();
       Mat descriptors1, descriptors2;
       extractor->compute(img1_gray,keypoints1,descriptors1);
       extractor->compute(img2_gray,keypoints2,descriptors2);

       // matching descriptors
       BFMatcher matcher(NORM_L2);
       vector<DMatch> matches;
       matcher.match(descriptors1, descriptors2, matches);

       // drawing the results

       Mat img_matches;
       drawMatches(img1, keypoints1, img2, keypoints2, matches, img_matches);
       imshow("matches1", img_matches);

但是代码返回的匹配点太多,我无法区分哪一个匹配哪个。

那么,是否有任何方法来获得高质量的匹配点?

在QT创建者中,我如何获得每个匹配点的像素坐标,就像MATLAB一样?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-04 11:12:23

那么,是否有任何方法来获得高质量的匹配点?

我打赌有很多不同的方法。我使用的是对称性测试。因此,从img1到img2的匹配在从img2匹配到img1时也必须存在。我正在使用Improve matching of feature points with OpenCV的测试。这里显示了多个其他测试。

代码语言:javascript
运行
复制
void symmetryTest(const std::vector<cv::DMatch> &matches1,const std::vector<cv::DMatch> &matches2,std::vector<cv::DMatch>& symMatches)
{
    symMatches.clear();
    for (vector<DMatch>::const_iterator matchIterator1= matches1.begin();matchIterator1!= matches1.end(); ++matchIterator1)
    {
        for (vector<DMatch>::const_iterator matchIterator2= matches2.begin();matchIterator2!= matches2.end();++matchIterator2)
        {
            if ((*matchIterator1).queryIdx ==(*matchIterator2).trainIdx &&(*matchIterator2).queryIdx ==(*matchIterator1).trainIdx)
            {
                symMatches.push_back(DMatch((*matchIterator1).queryIdx,(*matchIterator1).trainIdx,(*matchIterator1).distance));
                break;
            }
        }
    }
}

就像András Kovács在相关的答案中说的那样,你也可以用RANSAC计算一个基本矩阵,用cv::findFundamentalMat消除异常值。

在QT创建者中,我如何获得每个匹配点的像素坐标,就像MATLAB一样?

我希望我理解得对,你想拥有匹配的同系物点的点坐标。我正在提取symmetryTest后各点的坐标。坐标在关键点内。

代码语言:javascript
运行
复制
for (size_t rows = 0; rows < sym_matches.size(); rows++) {

        float x1 = keypoints_1[sym_matches[rows].queryIdx].pt.x;
        float y1 = keypoints_1[sym_matches[rows].queryIdx].pt.y;        

        float x2 = keypoints_2[sym_matches[rows].trainIdx].pt.x;
        float y2 = keypoints_2[sym_matches[rows].trainIdx].pt.y;

        // Push the coordinates in a vector e.g. std:vector<cv::Point2f>>
    }

您也可以对您的matcheskeypoints1keypoint2进行同样的操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51129033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档