opencv 使用特征匹配找到单应性

opencv find homography using feature matching

我在这里参考计算单应性。 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();
    }
}

到目前为止,我在你的代码中没有看到任何错误的过程,但是你有 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 >> img 不起作用,那么您必须在从摄像头读取图像后尝试将图像转换为 CV_8UC1