【问题标题】:opencv find homography using feature matchingopencv使用特征匹配查找单应性
【发布时间】:2017-04-16 03:36:02
【问题描述】:

我在这里参考计算单应性。 http://docs.opencv.org/2.4/doc/tutorials/features2d/feature_homography/feature_homography.html

但是,即使它是参考代码,也会出现错误。 min_dist 值始终为 0,因此代码中 good_matches 的大小为 0。

出了什么问题,我们该如何解决?

int main(int argc, char **argv)
{

    cv::VideoCapture cam(0);
    cv::Mat img(480, 640, CV_8UC3, cv::Scalar(0, 0, 0));
    cv::Mat img2(480, 640, CV_8UC3, cv::Scalar(0, 0, 0));

    cv::Ptr<cv::AKAZE> akaze = cv::AKAZE::create();
    std::vector<cv::KeyPoint> kp;
    cv::Mat descr;

    while (1)
    {
        cam >> img;
        cv::Mat aka;
        akaze->detectAndCompute(img, cv::noArray(), kp, descr);
        cv::drawKeypoints(img, kp, aka);
        cv::imshow("AKAZE", aka);

        if (cv::waitKey(10) == 's')
        {
            break;
        }
        kp.clear();
    }
    akaze.release();

    std::vector<cv::KeyPoint> kp_query;
    cv::Mat descr_query;
    cv::Ptr<cv::AKAZE> akaze2 = cv::AKAZE::create();

    while (1)
    {
        cv::Mat aka;
        cam >> img2;
        akaze2->detectAndCompute(img2, cv::noArray(), kp_query, descr_query);

        cv::BFMatcher matcher(cv::NORM_HAMMING);
        std::vector<cv::DMatch> matches;
        matcher.match(descr_query, descr, matches);

        double max_dist = 0, min_dist = 100.0;
        for (int i = 0; i<descr_query.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<cv::DMatch> good_matches;

        for (int i = 0; i<descr_query.rows; i++)
        {
            if (matches[i].distance < 3 * min_dist)
                good_matches.push_back(matches[i]);
        }

        std::vector<cv::Point2f> train, query;

        for (int i = 0; i<good_matches.size(); i++)
        {
            train.push_back(kp[good_matches[i].queryIdx].pt);
            query.push_back(kp_query[good_matches[i].trainIdx].pt);
        }

        cv::Mat output_mask;
        cv::Mat H = cv::findHomography(train, query, CV_RANSAC, 3, output_mask);


        cv::Mat m;
        cv::drawMatches(img, kp, img2, kp_query, good_matches, m, cv::Scalar::all(-1), cv::Scalar::all(-1),
        std::vector<char>(), cv::DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);
        cv::imshow("match", m);

        cv::drawKeypoints(img2, kp_query, aka);

        cv::waitKey(10);
        kp_query.clear();
    }
}

【问题讨论】:

    标签: c++ opencv image-processing computer-vision homography


    【解决方案1】:

    到目前为止,我在您的代码中看不到任何错误的程序,但是您那里有 3 通道 8 位图像。尝试使用 1 通道 8 位图像,因为这是链接教程中图像的格式。因此,请尝试将两个图像的 cv::Mat img2(480, 640, CV_8UC3, cv::Scalar(0, 0, 0)); 更改为 cv::Mat img2(480, 640, CV_8UC1, cv::Scalar(0, 0, 0));。如果这不适用于cam &gt;&gt; img,那么您必须在从摄像头读取图像后尝试将图像转换为CV_8UC1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-11
      • 1970-01-01
      • 1970-01-01
      • 2018-04-27
      • 2013-07-31
      • 2013-11-15
      • 2018-05-08
      相关资源
      最近更新 更多