opencv的SIFT样例(CPP/python)

这篇具有很好参考价值的文章主要介绍了opencv的SIFT样例(CPP/python)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Python代码的实现:

import cv2
import numpy as np
import time
import os
def main():
    images = os.listdir('./images/')
    pre_image = cv2.imread('./images/1.jpg', 0)
    print("images:",images)

    # 初始化 SIFT 和 SURF
    sift = cv2.xfeatures2d.SIFT_create()
    # surf = cv2.xfeatures2d.SURF_create()
    bf = cv2.BFMatcher()
    start_time = time.time()

    for img in images:
        img2 = cv2.imread(os.path.join('./images', img), 0)

        # 寻找关键点和计算描述符
        kp1, des1 = sift.detectAndCompute(pre_image, None)
        kp2, des2 = sift.detectAndCompute(img2, None)

        ti = time.time()
        # 匹配关键点
        matches = bf.knnMatch(des1, des2, k=2)
        # 应用比值测试来获取好的匹配点
        good = []
        for m, n in matches:
            if m.distance < 0.75 * n.distance:
                good.append([m])

        # 可视化匹配结果
        img3 = cv2.drawMatchesKnn(pre_image, kp1, img2, kp2, good, None, flags=2)
        print("knnMatch spend time:{} second".format(time.time()-ti))

    print("this spend time is :{} second".format(time.time()-start_time))

if __name__ == "__main__":
    main()
  
#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>
#include <opencv2/xfeatures2d/nonfree.hpp>
#include <iostream>
#include <vector>
#include <ctime>
#include <sys/types.h>
#include <dirent.h>
#include <iostream>
#include <chrono>

void readFilesInDir(const std::string& dir_path, std::vector<std::string>& files)
{
    DIR *dir;
    struct dirent *ent;
    if ((dir = opendir(dir_path.c_str())) != NULL)
    {
        while ((ent = readdir(dir)) != NULL)
        {
            if (ent->d_name[0] != '.')
            {
                files.push_back(ent->d_name);
            }
        }
        closedir(dir);
    }
}
int main()
{
    std::vector<std::string> files;
    readFilesInDir("./images", files);

    cv::Ptr<cv::xfeatures2d::SIFT> sift = cv::xfeatures2d::SIFT::create();
    cv::BFMatcher bf;
    cv::Mat pre_image = cv::imread("./images/1.jpg", 0);
    clock_t start = clock();
    auto _start = std::chrono::high_resolution_clock::now();

    for (const auto& file : files)
    {
        cv::Mat img2 = cv::imread("./images/" + file, 0);

        std::vector<cv::KeyPoint> kp1, kp2;
        cv::Mat des1, des2;

        sift->detectAndCompute(pre_image, cv::noArray(), kp1, des1);
        sift->detectAndCompute(img2, cv::noArray(), kp2, des2);
        std::vector<std::vector<cv::DMatch>> matches;
        auto _t = std::chrono::high_resolution_clock::now();
        bf.knnMatch(des1, des2, matches, 2);
        std::vector<cv::DMatch> goodMatches;

        auto _e = std::chrono::high_resolution_clock::now();
        std::chrono::duration<double, std::milli> _elapsed = _e - _t;

        double _ex = _elapsed.count() / 1000.0;
        std::cout << "step spend time is :" << _ex << " s" << std::endl;


        for (int i = 0; i < matches.size(); ++i)
        {
            if (matches[i][0].distance < 0.75 * matches[i][1].distance)
            {
                goodMatches.push_back(matches[i][0]);
            }
        }
        cv::Mat img3;
        cv::drawMatches(pre_image, kp1, img2, kp2, goodMatches, img3, cv::Scalar::all(-1), cv::Scalar::all(-1), std::vector<char>(), cv::DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);
    }
    auto end = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double, std::milli> elapsed = end - _start;
    double elapsedSeconds = elapsed.count() / 1000.0;
    std::cout << "this spend time is: " << (double)(clock() - start) / CLOCKS_PER_SEC << " s : " << elapsedSeconds << " seconds" << std::endl;
    return 0;
}

结论说明:
两种代码在同一个环境上的,相同的图片大小和数量(19张图片),运行耗时如下:
python

spend time is : 57.90586733818054 second

c++

spend time is: 57.71 seconds

差距不会很明显,但是如果文件很多,并且使用多线程/多进程,会有一个比较明显的差距。文章来源地址https://www.toymoban.com/news/detail-805276.html

到了这里,关于opencv的SIFT样例(CPP/python)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 特征点的检测与匹配(ORB,SIFT,SURFT比较)[opencv-python]

    本文旨在总结opencv-python上特征点的检测和匹配。 1、特征点的检测(包括:ORB,SIFT,SURFT) 2、特侦点匹配方法 (包括:暴力法,FLANN,以及随机抽样一致性优化RANSAC算法) 注:由于SURF专利问题,所以opencv官方包目前不支持SURF但支持ORB和SIFT,安装opencv-contrib-python包就可以解决 一

    2024年02月06日
    浏览(47)
  • Python与OpenCV环境中,借助SIFT、单应性、KNN以及Ransac技术进行实现的图像拼接算法详细解析及应用

    一、引言 在当今数字化时代,图像处理技术的重要性不言而喻。它在无人驾驶、计算机视觉、人脸识别等领域发挥着关键作用。作为图像处理的一个重要部分,图像拼接算法是实现广阔视野图像的重要手段。今天我们将会讲解在Python和OpenCV环境下,如何使用SIFT、单应性、K

    2024年02月15日
    浏览(40)
  • 最新OpenCV中SIFT算法例程

    镜像安装最新OpencCV pip install opencv-python  -i https://pypi.tuna.tsinghua.edu.cn/simple 旧版OpenCV使用的SIFT函数:  sift = cv2.SIFT()                                                   sift = cv2.xfeatures2d.SIFT_create() 新版OpenCV使用的SIFT函数:  sift = cv2.SIFT_create() 输出的图像是以参数的形式给

    2024年01月18日
    浏览(32)
  • OpenCV SIFT源码详解——detectAndCompute函数详解

    useProvidedKeypoints参数决定当前是探测关键点还是计算描述符 useProvidedKeypoints 为true时,执行compute功能,计算描述符;为false时,执行detect功能,探测关键点; 当探测关键点时,构建的高斯金字塔首层图像会扩大两倍, firstOctave 等于-1;而计算描述符时, firstOctave 会根据传入的

    2024年02月16日
    浏览(37)
  • 学习笔记:Opencv实现图像特征提取算法SIFT

    2023.8.19 为了在暑假内实现深度学习的进阶学习,特意学习一下传统算法,分享学习心得,记录学习日常 SIFT的百科: SIFT = Scale Invariant Feature Transform, 尺度不变特征转换 全网最详细SIFT算法原理实现_ssift算法_Tc.小浩的博客-CSDN博客 在环境配置中要配置opencv: pip install opencv-c

    2024年02月12日
    浏览(44)
  • opencv 进阶15-检测DoG特征并提取SIFT描述符cv2.SIFT_create()

    前面我们已经了解了Harris函数来进行角点检测,因为角点的特性,这些角点在图像旋转的时候也可以被检测到。但是,如果我们放大或缩小图像时,就可能会丢失图像的某些部分,甚至有可能增加角点的质量。这种损失的现象需要一种与图像比例无关的角点检测方法来解决。

    2024年02月11日
    浏览(46)
  • OpenHarmony OpenCV应用样例开发

    背景 OpenCV 介绍 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它由一系列的 C 函数和少量 C++ 类构成,同时提供 Python、Java 和 MATLAB 等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。 OpenCV 具有极广的应用领域,它包括但不

    2024年04月14日
    浏览(33)
  • OpenCV 入门教程:SIFT和SURF特征描述

    SIFT (尺度不变特征变换)和 SURF (加速稳健特征)是图像处理中常用的特征描述算法,用于提取图像中的关键点和生成对应的特征描述子。这些算法具有尺度不变性、旋转不变性和光照不变性等特点,适用于图像匹配、目标识别和三维重建等应用。本文将以 SIFT 和 SURF 特征

    2024年02月15日
    浏览(57)
  • OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\imgproc\src\resize.cpp:4052

    报错4052 查询好久,对resize的图片逐个检查,发现可能是路径设置问题导致图片路径文件夹中有其他格式的文件。。。。在对文件夹遍历读取的时候,并没有对读入的文件再进行if判断是否为jpg,因此出现了resize的崩溃。。。重新设置路径新建文件夹输入图片就好了

    2024年02月15日
    浏览(30)
  • 【OpenCV】双目相机标定、极线矫正、SIFT匹配以及深度估计

    双目标定有很多示例,就不多讲,直接放代码 有个小技巧就是可以先使用matlab标定箱试一下,把误差过大的左右相机图片剔除,保证精度 匹配: 过滤: 这里过滤条件2需要注意一下 ,因为我们是进行了极线校正的,所以理论上左右视图相同的点应该在同一条水平线上,即像

    2024年02月07日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包