精华内容
下载资源
问答
  • 基于SUFT的OPENCV双目立体匹配系统,VS2013MFC 实现
  • suft.edu-源码

    2021-03-25 15:48:55
    suft.edu
  • 【opencv学习之四十一】SIFT和SUFT算法

    千次阅读 2018-02-21 22:22:58
    SIFT和SUFT算法是有相关专利的,所以在opencv中属于"nonfree"里的,在opencv2.x.x版本可能还有保留,但是在opencv3.x.x后就没有了,需要单独下载opencv_contrib库,然后自己Cmake;相关算法的详解这里不做...

    SIFT和SUFT算法是有相关专利的,所以在opencv中属于"nonfree"里的,在opencv2.x.x版本可能还有保留,但是在opencv3.x.x后就没有了,需要单独下载opencv_contrib库,然后自己Cmake;

    相关算法的详解这里不做过多解释了,推举两个大神博客:

    1.小魏的修行的博客:http://blog.csdn.net/xiaowei_cqu/article/details/8069548;

    2.赵春江的源码详细分析:http://blog.csdn.net/zhaocj/article/details/42124473;

    3.详细分析算法原理:http://blog.csdn.net/zddblog/article/details/7521424;

    大家可以在网上再看看,相关解释等很多;

    下面贴几个简单实例:

    sift实例:

    void imgSIFT()//SIFT算法
    {
        //sift算法不是开源的所以很多内容用起来很不方便
        //Create SIFT class pointer
        Ptr<Feature2D> f2d = xfeatures2d::SIFT::create();
        //1、读入图片
        Mat img_1 = imread("D:/ImageTest/source.png");//模板图片
        Mat img_2 = imread("D:/ImageTest/222.JPG");//检测图片
        //2、声明检测点;Detect the keypoints
        vector<KeyPoint> keypoints_1, keypoints_2;
        f2d->detect(img_1, keypoints_1);
        f2d->detect(img_2, keypoints_2);
        //3、计算描述符(特征向量);Calculate descriptors (feature vectors)
        Mat descriptors_1, descriptors_2;
        f2d->compute(img_1, keypoints_1, descriptors_1);
        f2d->compute(img_2, keypoints_2, descriptors_2);
        //4、使用BFMatcher匹配描述符向量;Matching descriptor vector using BFMatcher
        BFMatcher matcher;
        vector<DMatch> matches;
        matcher.match(descriptors_1, descriptors_2, matches);
        //5、绘制匹配出的关键点
        Mat img_matches;
        drawMatches(img_1, keypoints_1, img_2, keypoints_2, matches, img_matches);
        imshow("match",img_matches);
        //6、匹配结果筛选
        nth_element(matches.begin(), matches.begin()+30, matches.end());   //提取出前最佳匹配结果
        matches.erase(matches.begin()+30, matches.end());    //剔除掉其余的匹配结果
        Mat img_matches2;
        drawMatches(img_1, keypoints_1, img_2, keypoints_2, matches, img_matches2);
        imshow("match2",img_matches2);
        waitKey(0);
    }

    效果,未过滤:


    过滤后:


    SURF算法:

    void imgSURF()//SURF算法
    {
        //1、加载图片
        Mat img_1 = imread( "D:/ImageTest/source.png", IMREAD_GRAYSCALE );//模板图片
        Mat img_2 = imread("D:/ImageTest/222.JPG", IMREAD_GRAYSCALE );//被查找图片
        //2、使用SURF检测器检测关键点,计算描述符;Detect the keypoints using SURF Detector, compute the descriptors
        int minHessian = 400;
        Ptr<SURF> detector = SURF::create();
        detector->setHessianThreshold(minHessian);
        std::vector<KeyPoint> keypoints_1, keypoints_2;
        Mat descriptors_1, descriptors_2;
        detector->detectAndCompute( img_1, Mat(), keypoints_1, descriptors_1 );
        detector->detectAndCompute( img_2, Mat(), keypoints_2, descriptors_2 );
        //3、匹配描述符向量与一个蛮力匹配;Matching descriptor vectors with a brute force matcher
        BFMatcher matcher(NORM_L2);
        std::vector< DMatch > matches;
        matcher.match( descriptors_1, descriptors_2, matches );
        //4、绘制匹配结果;Draw matches
        Mat img_matches;
        drawMatches( img_1, keypoints_1, img_2, keypoints_2, matches, img_matches );
        //5、显示检测到匹配; Show detected matches
        imshow("SURF_Matches", img_matches );
        //6、匹配结果筛选
        nth_element(matches.begin(), matches.begin()+50, matches.end());   //提取出前最佳匹配结果
        matches.erase(matches.begin()+50, matches.end());    //剔除掉其余的匹配结果
        Mat img_matches2;
        drawMatches(img_1, keypoints_1, img_2, keypoints_2, matches, img_matches2);
        imshow("SURF_Matches2",img_matches2);
        waitKey(0);
    }
    

    效果:



    SURF算法计算匹配(opencv文档实例),并输出点信息:

    void imgSURF2()//SURF算法2
    {
          Mat img_1 = imread( "D:/ImageTest/source.png", IMREAD_GRAYSCALE );
          Mat img_2 = imread("D:/ImageTest/222.JPG", IMREAD_GRAYSCALE );
          if( !img_1.data || !img_2.data )
          { std::cout<< " --(!) Error reading images " << std::endl; }
          //-- Step 1: Detect the keypoints using SURF Detector, compute the descriptors
          int minHessian = 400;
          Ptr<SURF> detector = SURF::create();
          detector->setHessianThreshold(minHessian);
          std::vector<KeyPoint> keypoints_1, keypoints_2;
          Mat descriptors_1, descriptors_2;
          detector->detectAndCompute( img_1, Mat(), keypoints_1, descriptors_1 );
          detector->detectAndCompute( img_2, Mat(), keypoints_2, descriptors_2 );
          //-- Step 2: Matching descriptor vectors using FLANN matcher
          FlannBasedMatcher matcher;
          std::vector< DMatch > matches;
          matcher.match( descriptors_1, descriptors_2, matches );
          double max_dist = 0; double min_dist = 100;
          //-- Quick calculation of max and min distances between keypoints
          for( int i = 0; i < descriptors_1.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 );
          //-- Draw only "good" matches (i.e. whose distance is less than 2*min_dist,
          //-- or a small arbitary value ( 0.02 ) in the event that min_dist is very
          //-- small)
          //-- PS.- radiusMatch can also be used here.
          std::vector< DMatch > good_matches;
          for( int i = 0; i < descriptors_1.rows; i++ )
          { if( matches[i].distance <= max(2*min_dist, 0.02) )
            { good_matches.push_back( matches[i]); }
          }
          //-- Draw only "good" matches
          Mat img_matches;
          drawMatches( img_1, keypoints_1, img_2, keypoints_2,
                       good_matches, img_matches, Scalar::all(-1), Scalar::all(-1),
                       vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );
          //-- Show detected matches
          imshow( "Good Matches", img_matches );
          for( int i = 0; i < (int)good_matches.size(); i++ )
          { printf( "-- Good Match [%d] Keypoint 1: %d  -- Keypoint 2: %d  \n", i, good_matches[i].queryIdx, good_matches[i].trainIdx ); }
    
          cout<<"key:"<<keypoints_1[0].pt.x<<endl;
          waitKey(0);
    }

    效果:




    展开全文
  • SUFT是什么,是个算法还是什么别的 SUFT是什么,是个算法还是什么别的 SUFT是什么,是个算法还是什么别的
  • 文件名称: opensurf下载 收藏√ [5 4 3 2 1]开发工具: matlab文件大小: 1539 KB上传时间: 2013-06-28下载次数: 12提 供 者: 魏颖详细说明:OPEN SUFT 算法源代码 ,内容详细,非常适合初学者-OPEN SUFT algorithm ...

    文件名称: opensurf891ea1e7dab975064c6bfd22796603ae.gif下载

      收藏√  [443d104427974206832dc4b12407db70.gif

     5  4  3  2  1 fb9128a58cbeaabbeb3718ed75079ccf.gif]

    开发工具: matlab

    文件大小: 1539 KB

    上传时间: 2013-06-28

    下载次数: 12

    提 供 者: 魏颖

    详细说明:OPEN SUFT 算法源代码 ,内容详细,非常适合初学者-OPEN SUFT algorithm source code, detailed and very suitable for beginners

    文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):

    OpenSURF_version1c\example2.asv

    ..................\example2.m

    ..................\example3.asv

    ..................\example3.m

    ..................\license.txt

    ..................\OpenSurf.m

    ..................\opensurf.png

    ..................\SubFunctions\FastHessian_BuildDerivative.m

    ..................\............\FastHessian_buildResponseLayer.m

    ..................\............\FastHessian_buildResponseMap.m

    ..................\............\FastHessian_getIpoints.m

    ..................\............\FastHessian_getLaplacian.m

    ..................\............\FastHessian_getResponse.m

    ..................\............\FastHessian_interpolateExtremum.m

    ..................\............\FastHessian_isExtremum.m

    ..................\............\FastHessian_ResponseLayer.m

    ..................\............\IntegralImage_BoxIntegral.m

    ..................\............\IntegralImage_HaarX.m

    ..................\............\IntegralImage_HaarY.m

    ..................\............\IntegralImage_IntegralImage.m

    ..................\............\PaintSURF.m

    ..................\............\SurfDescriptor_DecribeInterestPoints.m

    ..................\............\SurfDescriptor_GetDescriptor.m

    ..................\............\SurfDescriptor_GetOrientation.m

    ..................\TestImages\all.jpg

    ..................\..........\all1.jpg

    ..................\..........\lena1.png

    ..................\..........\lena2.png

    ..................\..........\segment.jpg

    ..................\..........\segment1.JPG

    ..................\..........\test.png

    ..................\..........\testc1.png

    ..................\..........\testc2.png

    ..................\..........\Thumbs.db

    ..................\WarpFunctions\affine_warp.m

    ..................\SubFunctions

    ..................\TestImages

    ..................\WarpFunctions

    OpenSURF_version1c

    输入关键字,在本站238万海量源码库中尽情搜索:

    帮助

    [matching.rar] - SUFT匹配,按照lower的论文写成。运行时间比较快速。

    [opensurf.rar] - 基于opencv的角点检测程序,surf算法提取角点,并进行图像匹配。

    [opensurf.rar] - 这是有关SURF算法的库的说明。希望对学习角点检测的朋友有帮助。

    [KeyDrum-(3).zip] - Subject : KeyDrum

    Development Suft : VC 2008

    Language : MFC(GDI++), C/C++

    展开全文
  • SIFT SUFT FAST ORB

    2018-09-27 10:17:09
    SIFT Scale Invariant Feature Transform,尺度不变特征变换。SIFT特征对旋转、尺度缩放、亮度变化等保持不变性,是一种非常稳定的局部特征。 SIFT算法主要有以下几个步骤: 高斯差分金字塔的构建 ...

    SIFT

    Scale Invariant Feature Transform,尺度不变特征变换。SIFT特征对旋转、尺度缩放、亮度变化等保持不变性,是一种非常稳定的局部特征。

    SIFT算法主要有以下几个步骤:

    • 高斯差分金字塔的构建
      使用组和层的结构构建了一个具有线性关系的金字塔(尺度空间),这样可以在连续的高斯核尺度上查找图像的特征点;另外,它使用一阶的高斯差分来近似高斯的拉普拉斯核,大大的减少了运算量。
    • 尺度空间的极值检测及特征点的定位
      搜索上一步建立的高斯尺度空间,通过高斯差分来识别潜在的对尺度和旋转不变的特征点。但是,在离散空间中,局部极值点可能并不是真正意义的极值点,真正的极值点有可能落在离散点的间隙中,SIFT通过尺度空间DoG函数进行曲线拟合寻找极值点。
    • 特征方向赋值
      基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向,后续的所有操作都是对于关键点的方向、尺度和位置进行变换,从而提供这些特征的不变性。
    • 特征描述子的生成
      通过上面的步骤已经找到的SIFT特征点的位置、方向、尺度信息,最后使用一组向量来描述特征点及其周围邻域像素的信息。

    SURF

    Speeded Up Robust Features。加速版的SIFT。

    SURF的流程和SIFT比较类似,这些改进体现在以下几个方面:

    • 特征点检测是基于Hessian矩阵,依据Hessian矩阵行列式的极值来定位特征点的位置。并且将Hession特征计算与高斯平滑结合在一起,两个操作通过近似处理得到一个核模板。
    • 在构建尺度空间时,使用box filter与源图像卷积,而不是使用DoG算子。
    • SURF使用一阶Haar小波在x、y两个方向的响应作为构建特征向量的分布信息。

    FAST

    Features From Accelerated Segment Test,以速度快而著称

    检测局部像素灰度变化明显的地方,

    FAST算法提取角点的步骤:

    • 在图像中选择像素p,假设其灰度值为:IpIp
    • 设置一个阈值T,例如:IpIp的20%
    • 选择p周围半径为3的圆上的16个像素,作为比较像素
    • 假设选取的圆上有连续的N个像素大于Ip+TIp+T或者Ip−TIp−T,那么可以认为像素p就是一个特征点。(N通常取12,即为FAST-12;常用的还有FAST-9,FAST-11)。

    不可避免的也有一些缺点

    • 检测到的特征点过多并且会出现“扎堆”的现象。这可以在第一遍检测完成后,使用非最大值抑制(Non-maximal suppression),在一定区域内仅保留响应极大值的角点,避免角点集中的情况。
    • FAST提取到的角点没有方向和尺度信息

    上面的介绍的SIFT和SURF算法都包含有各自的特征点描述子的计算方法,而FAST不包含特征点描述子的计算,仅仅只有特征点的提取方法,这就需要一个特征点描述方法来描述FAST提取到的特征点,以方便特征点的匹配。下面介绍一个专门的特征点描述子的计算算法。

    BRIEF描述子

    BRIEF是一种二进制的描述子,其描述向量是0和1表示的二进制串。0和1表示特征点邻域内两个像素(p和q)灰度值的大小:如果p比q大则选择1,反正就取0。在特征点的周围选择128对这样的p和q的像素对,就得到了128维由0,1组成的向量。那么p和q的像素对是怎么选择的呢?通常都是按照某种概率来随机的挑选像素对的位置。
    BRIEF使用随机选点的比较,速度很快,而且使用二进制串表示最终生成的描述子向量,在存储以及用于匹配的比较时都是非常方便的,其和FAST的搭配起来可以组成非常快速的特征点提取和描述算法。

    ORB

    Oriented FAST and Rotated BRIE

    • 使用非最大值抑制,在一定区域内仅仅保留响应极大值的角点,避免FAST提取到的角点过于集中。
    • FAST提取到的角点数量过多且不是很稳定,ORB中可以指定需要提取到的角点的数量N,然后对FAST提取到的角点分别计算Harris响应值,选择前N个具有最大响应值的角点作为最终提取到的特征点集合。
    • FAST提取到的角点不具有尺度信息,在ORB中使用图像金字塔,并且在每一层金字塔上检测角点,以此来保持尺度的不变性。
    • FAST提取到的角点不具有方向信息,在ORB中使用灰度质心法(Intensity Centroid)来保持特征的旋转不变性。

     

    展开全文
  • opencv3:suft+ransac

    2018-12-09 11:24:01
    环境:vs2017+opencv3.3.0 代码: #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp>...#include "imgproc/imgproc.hpp" ...opencv2/features2d/features2d.hpp>...

    环境:vs2017+opencv3.3.0

    代码:

    
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp> 
    #include "imgproc/imgproc.hpp"  
    #include <opencv2/features2d/features2d.hpp> 
    #include "opencv2/xfeatures2d/nonfree.hpp" 
    #include <vector>
    #include "opencv2/opencv.hpp"
    
    using namespace cv;
    using namespace std;
    //计算原始图像点位在经过矩阵变换后在目标图像上对应位置  
    Point2f getTransformPoint(const Point2f originalPoint, const Mat &transformMaxtri)
    {
    	Mat originelP, targetP;
    	originelP = (Mat_<double>(3, 1) << originalPoint.x, originalPoint.y, 1.0);
    	targetP = transformMaxtri * originelP;
    	float x = targetP.at<double>(0, 0) / targetP.at<double>(2, 0);
    	float y = targetP.at<double>(1, 0) / targetP.at<double>(2, 0);
    	return Point2f(x, y);
    }
    
    int main(int argc, char *argv[])
    {
    	//Mat image01 = imread("D:\\myvs\\Projects\\cvTest3\\Project1\\Project1\\拼接一次.jpg");
    	Mat image01 = imread("D:\\myvs\\Projects\\cvTest\\cvTest\\拼接结果1.jpg");
    	//Mat image01 = imread("D:\\Chrome Download\\dataset\\CAB\\P1010435.JPG");
    	Mat image02 = imread("D:\\Chrome Download\\dataset\\CAB\\P1010437.JPG");
    	
    	//imshow("拼接图像1", image01);
    	//imshow("拼接图像2", image02);
    
    
    	//灰度图转换  
    	Mat image1, image2;
    	cvtColor(image01, image1, CV_RGB2GRAY);
    	cvtColor(image02, image2, CV_RGB2GRAY);
    
    	//提取特征点    
    	int minHessian = 4000;//2000
    	Ptr<xfeatures2d::SURF> surfDetector = xfeatures2d::SURF::create(minHessian);
    	vector<KeyPoint> keyPoint1, keyPoint2,keyPoint3,keyPoint4;
    	surfDetector->detect(image1, keyPoint1);
    	surfDetector->detect(image2, keyPoint2);
    
    	//特征点描述,为下边的特征点匹配做准备    
    	Mat imageDesc1, imageDesc2;
    	surfDetector->compute(image1, keyPoint1, imageDesc1);
    	surfDetector->compute(image2, keyPoint2, imageDesc2);
    
    	//获得匹配特征点,并提取最优配对     
    	FlannBasedMatcher matcher;
    	vector<vector<DMatch> > GoodMatchePoints;
    	vector<DMatch> matchePoints, matchePoints2;
    	//matcher.match(imageDesc1, imageDesc2, matchePoints, Mat());
    	matcher.knnMatch(imageDesc1, imageDesc2, GoodMatchePoints, 2);
    	
    
    	// Lowe's algorithm,获取优秀匹配点
    	for (int i = 0; i < GoodMatchePoints.size(); i++)
    	{
    		if (GoodMatchePoints[i][0].distance < 0.5 * GoodMatchePoints[i][1].distance)
    		{
    			matchePoints.push_back(GoodMatchePoints[i][0]);
    		}
    	}
    	cout << "total match points: " << matchePoints.size() << endl;
    	sort(matchePoints.begin(), matchePoints.end()); //特征点排序    
    													//获取排在前N个的最优匹配特征点  
    	vector<Point2f> imagePoints1, imagePoints2;
    	int t=10;
    	if (matchePoints.size()<10)
    	{
    		t = matchePoints.size();
    	}
    		
    	for (int i = 0; i < t; i++)
    	{
    		matchePoints2.push_back(matchePoints[i]);
    	}
    
    	for (int i = 0; i < matchePoints.size(); i++)
    	{
    		imagePoints1.push_back(keyPoint1[matchePoints[i].queryIdx].pt);
    		imagePoints2.push_back(keyPoint2[matchePoints[i].trainIdx].pt);
    	}
    	
    	Mat first_match;
    	drawMatches(image01, keyPoint1, image02, keyPoint2, matchePoints2, first_match, Scalar(0,0,255));
    	imwrite("first_match.jpg ", first_match);
    	//imshow("first_match ", first_match);
    	Mat m_Fundamental;
    	vector<uchar> m_RANSACStatus;
    	m_Fundamental=findFundamentalMat(imagePoints1, imagePoints2, m_RANSACStatus, FM_RANSAC);
    	
    	// 计算野点个数
    	int OutlinerCount = 0;
    	for (int i = 0; i < matchePoints.size(); i++)
    	{
    		if (m_RANSACStatus[i] == 0) // 状态为0表示野点
    		{
    			OutlinerCount++;
    		}
    	}
    	vector<Point2f> m_LeftInlier;
    	vector<Point2f> m_RightInlier;
    	vector<DMatch> m_InlierMatches;
    	// 上面三个变量用于保存内点和匹配关系
    	int ptCount = (int)matchePoints.size();
    	int InlinerCount = ptCount - OutlinerCount;
    	m_InlierMatches.resize(InlinerCount);
    	m_LeftInlier.resize(InlinerCount);
    	m_RightInlier.resize(InlinerCount);
    	InlinerCount = 0;
    	for (int i = 0; i < ptCount; i++)
    	{
    		if (m_RANSACStatus[i] != 0)
    		{
    			m_LeftInlier[InlinerCount].x = imagePoints1[i].x;
    			m_LeftInlier[InlinerCount].y = imagePoints1[i].y;
    			m_RightInlier[InlinerCount].x = imagePoints2[i].x;
    			m_RightInlier[InlinerCount].y = imagePoints2[i].y;
    			m_InlierMatches[InlinerCount].queryIdx = InlinerCount;
    			m_InlierMatches[InlinerCount].trainIdx = InlinerCount;
    			m_InlierMatches[InlinerCount].distance = matchePoints[i].distance;
    			InlinerCount++;
    		}
    	}
    	vector<KeyPoint> key1(InlinerCount);
    	vector<KeyPoint> key2(InlinerCount);
    	KeyPoint::convert(m_LeftInlier, key1);
    	KeyPoint::convert(m_RightInlier, key2);
    	printf("最终的匹配点个数为:%d\n",InlinerCount);
    	
    	for (int i = 0; i < t; i++)
    	{
    		matchePoints2.push_back(matchePoints[i]);
    	}
    	Mat first_match2;
    	drawMatches(image01, key1, image02, key2,  m_InlierMatches, first_match2, Scalar(0, 0, 255));
    	imwrite("first_match2.jpg ", first_match2);
    
    	waitKey();
    	return 0;
    
    }
    
    

    效果图:radsac之前

    ransac之后:

     效果还是有的,白线处的错误匹配被消除了,但是没有消除所有错误匹配 : (

    展开全文
  • sift, suft等注册了知识产权的算法将不能在opencv4中使用,原先在opencv3中能正常使用的代码sift = cv2.xfeatures2d.SIFT_create()将提示AttributeError: module 'cv2.cv2' has no attribute 'xfeatures2d'。...
  • 使用opencv中的sift和surf函数来检测特征点和描述特征点,以及怎样使用其算法来进行特征点匹配 使用环境:opencv2.4.6+vs2010 功能:找出2幅图中特征点,并将其描述出来,且在2幅中进行匹配。...
  • 听说sift和suft可以解决这类问题,opencv有封装的sift和suft方法的文档(没找到)。实际应用中可能是在视频里面查找多个目标物体。 目标图像大小5184*3456,模板大小512*512以上. 另外还想问以下问题: 1.图像中...
  • FAST算法原理:若某像素与其周围邻域内足够多的像素点相差较大,则该点可能是角点。用FAST算法检测角点,代替差分高斯金字塔取极值检测角点的方法,速度块;接着用SIFT特征描述符描述角点,省略尺度空间值,只用原图...
  • c++实现SURF算法

    2018-03-07 09:33:16
    c++实现SURF算法,代码资源, 代码需要vs + opencv, 实测vs2013+opencv2.4.10可用
  • 实现对图像的sift特征提取,并利用bow模型进行聚类,并对bow下的特征进行提取和保存
  • SURF算法

    万次阅读 多人点赞 2019-01-18 20:23:05
    SURF SURF(Speeded Up Robust Features)是对SIFT的一种改进,主要特点是快速。SURF与SIFT主要有以下几点不同处理: 1、 SIFT在构造DOG金字塔以及求DOG局部空间极值比较耗时,SURF的改进是使用Hessian矩阵变换...
  • 我想检测图像关键点。我使用OpenCV库中的不同特征检测器尝试了以下代码。适用于ORB,BRISK,FAST等但不适用于SURF / SIFT甚至MSER探测器!public class ReadImaageActivity extends ActionBarActivity {Mat image ;...
  • Opencv下利用SIFT、SURF、ORB三种特征点实现图像匹配
  • 原始素材 原始的图片是1080x1920, 我用电脑自带的画图把分辨率改为了 720×1280, 2560×1440, 另外还加了一个90度旋转的...大佬说sift如果3秒钟, 那么suft可以1秒钟 完整源码 声明 部分内容来自网络 本教程仅用于学
  • 一、SiFT特征匹配 上一篇文章我们已经介绍了SIFT的特征提取原理及步骤,这篇我们来研究SIFT对的两张图片的特征点进行匹配。过程一般就是特征点提取,特征匹配。 为了计算图像的SIFT特征,我们用开源工具包VLFeat。...
  • 一、简介 SIFT即尺度不变特征变换,是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。 1 SIFT算法特点: (1)具有较好的稳定性和不变性,能够适应旋转、尺度...
  • sift的java实现解述

    万次阅读 热门讨论 2013-07-04 17:05:07
    代码已经开源到github上,https://github.com/alibaba/simpleimage项目,其中的 analyze...原始图片为:主要调用方法: BufferedImage img = ImageIO.read(logoFile); RenderImage ri = new RenderImage(img); ...
  • 【实例简介】OpenCV官方教程中文翻译版,python语言,自做完整书签方便查找阅读内容详细,是学OpenCV的必备教程书虽然挺好的,但是不够全面,不能让读者完全了解 opencv的现状)。而我翻译的这本书是来源于 OpenCv的...
  • 牙叔教程 简单易懂 测试图片 小图, 从大图右下角裁剪出来的 大图, 分辨率1280X720 对大图的更改分三种 不更改大图, 这又分两种, 一种是裁剪大图右下角后再对比, 一种是不裁剪 大图保持纵横比, 缩放至70% ...
  • 图像特征点

    2011-12-18 20:42:17
    SIFT,HARRIS,SUFT特征点的对比
  • SURF到底比SIFT快在哪里?

    万次阅读 多人点赞 2019-03-18 17:58:37
    1、SURF,Speeded Up Robust Features,加速稳健特征。 2、Surf与Sift算法一样,Surf算法的基本路程可以分为三大部分:局部特征点的提取、特征点的描述、特征点的匹配。 3、Surf在执行效率上有两大制胜法宝——一...
  • SIFT和SURF的比较

    千次阅读 2018-03-12 09:44:19
    本文为转载:原博客地址:http://blog.csdn.net/jwh_bupt/article/details/6567452局部特征系列:局部特征(1)——入门篇局部特征(2)——Harris角点 局部特征(3)——SURF特征总结 局部特征(4)——SIFT和SURF的比较 ...
  • 图像识别之SURF算法

    千次阅读 2019-04-12 13:49:14
    SURF 算法,全称是 Speeded-Up Robust Features。该算子在保持 SIFT 算子优良性能特点的基础上,同时解决了 SIFT 计算复杂度高、耗时长的缺点,对兴趣点提取及其特征向量描述方面进行了改进,且计算速度得到提高。...
  • 【实例简介】纯java代码写的sift图片识别算法,欢迎交流指正!图片匹配效果还是可以的,可以直接运行!木有使用opencv、metlab等api = =【实例截图】【核心代码】Pic_True└── Pic_True├── bin│ └── pic│ ...
  • opencv之SURF图像匹配

    万次阅读 多人点赞 2017-04-19 14:04:11
    1.概述前面介绍模板匹配的时候已经提到模板匹配时一种基于灰度的匹配方法,而基于特征的匹配方法有FAST、SIFT、SURF等,上面两篇文章已经介绍过使用Surf算法进行特征点检测以及使用暴力匹配(BruteForceMatcher)和...
  • 基于opencv-2.4.9的特征提取及匹配。运行环境ubuntu操作系统,对surf特征进行提取及匹配,采用暴力匹配算法。此代码是一个cmake工程,需安装cmake
  • OpenCV之sift图像匹配

    千次阅读 2018-05-03 15:33:23
    OpenCV提供的视觉处理算法非常丰富,并且她部分以C语言编写,加上其开源的特性,处理得当,不需要添加新的外部支持也可以完整的编译连接生成执行程序。SIFT算法的特点有:1. SIFT特征是图像的局部特征,其对旋转、...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 195
精华内容 78
关键字:

suft