图像匹配之:经典sift算法(二)

三、sift算法的应用

1、sift的main函数

[cpp]  view plain copy
  1. #include "sift.h"  
  2. #include "imgfeatures.h"  
  3. #include "kdtree.h"  
  4. #include "utils.h"  
  5. #include "xform.h"  
  6.   
  7. #include <cv.h>  
  8. #include <cxcore.h>  
  9. #include <highgui.h>  
  10.   
  11. #include <stdio.h>  
  12.   
  13.   
  14. /* the maximum number of keypoint NN candidates to check during BBF search */  
  15. #define KDTREE_BBF_MAX_NN_CHKS 200  
  16.   
  17. /* threshold on squared ratio of distances between NN and 2nd NN */  
  18. #define NN_SQ_DIST_RATIO_THR 0.49  
  19.   
  20. /******************************** Globals ************************************/  
  21.   
  22. char img1_file[] = "beaver.png";  
  23. char img2_file[] = "beaver_xform.png";  
  24.   
  25. /********************************** Main *************************************/  
  26.   
  27.   
  28. int main( int argc, char** argv )  
  29. {  
  30.     IplImage* img1, * img2, * stacked;  
  31.     struct feature* feat1, * feat2, * feat;  
  32.     struct feature** nbrs;  
  33.     struct kd_node* kd_root;  
  34.     CvPoint pt1, pt2;  
  35.     double d0, d1;  
  36.     int n1, n2, k, i, m = 0;  
  37.   
  38.     img1 = cvLoadImage( img1_file, 1 );  
  39.     if( ! img1 )  
  40.         fatal_error( "unable to load image from %s", img1_file );  
  41.     img2 = cvLoadImage( img2_file, 1 );  
  42.     if( ! img2 )  
  43.         fatal_error( "unable to load image from %s", img2_file );  
  44.     stacked = stack_imgs( img1, img2 );  
  45.   
  46.     fprintf( stderr, "Finding features in %s...\n", img1_file );  
  47.     n1 = sift_features( img1, &feat1 );  
  48.     fprintf( stderr, "Finding features in %s...\n", img2_file );  
  49.     n2 = sift_features( img2, &feat2 );  
  50.   
  51.   
  52.     kd_root = kdtree_build( feat2, n2 );  
  53.     for( i = 0; i < n1; i++ )  
  54.     {  
  55.         feat = feat1 + i;  
  56.         k = kdtree_bbf_knn( kd_root, feat, 2, &nbrs, KDTREE_BBF_MAX_NN_CHKS );  
  57.         if( k == 2 )  
  58.         {  
  59.             d0 = descr_dist_sq( feat, nbrs[0] );  
  60.             d1 = descr_dist_sq( feat, nbrs[1] );  
  61.             if( d0 < d1 * NN_SQ_DIST_RATIO_THR )  
  62.             {  
  63.                 pt1 = cvPoint( cvRound( feat->x ), cvRound( feat->y ) );  
  64.                 pt2 = cvPoint( cvRound( nbrs[0]->x ), cvRound( nbrs[0]->y ) );  
  65.                 pt2.y += img1->height;  
  66.                 cvLine( stacked, pt1, pt2, CV_RGB(255,0,255), 1, 8, 0 );  
  67.                 m++;  
  68.                 feat1[i].fwd_match = nbrs[0];  
  69.             }  
  70.         }  
  71.         free( nbrs );  
  72.     }  
  73.   
  74.     fprintf( stderr, "Found %d total matches\n", m );  
  75.     cvNamedWindow( "Matches", 1 );  
  76.     cvShowImage( "Matches", stacked );  
  77.     cvSaveImage("1.bmp",stacked,0);  
  78.     cvWaitKey( 0 );  
  79.   
  80.     cvReleaseImage( &stacked );  
  81.     cvReleaseImage( &img1 );  
  82.     cvReleaseImage( &img2 );  
  83.     kdtree_release( kd_root );  
  84.     free( feat1 );  
  85.     free( feat2 );  
  86.     return 0;  
  87. }  


Sift(Scale InvariantFeature Transform)是一个很好的图像匹配算法,同时能处理亮度、平移、旋转、尺度的变化,利用特征点来提取特征描述符,最后在特征描述符之间寻找匹配。

sift库分析:

总共包含6 个文件再加上一个main.c文件。

untils.c

minpq.c

imgfeature.c

sift.c

xform.c

kdtree.c

以及其对应的.h文件

最核心的文件是sift.c 和 kdtree.c

1 sift.c 寻找图片中的特征点

主要步骤:

a、构建尺度空间,检测极值点,获得尺度不变性;

b、特征点过滤并进行精确定位,剔除不稳定的特征点;

c、在特征点处提取特征描述符,为特征点分配方向值;

d、生成特征描述子,利用特征描述符寻找匹配点;

以特征点为中心取16*16的邻域作为采样窗口,

将采样点与特征点的相对方向通过高斯加权后归入包含8个bin的方向直方图,

最后获得4*4*8的128维特征描述子。

2 kdtree.c 对两幅图像进行匹配

    主要步骤:

    当两幅图像的Sift特征向量生成以后,下一步就可以采用关键点特征向量的欧式距离来作为两幅图像中关键点的相似性判定度量。

取图1的某个关键点,通过遍历找到图像2中的距离最近的两个关键点。在这两个关键点中,如果次近距离除以最近距离小于某个阙值,则判定为一对匹配点。

3 imgfeature.c在以上图片中画上标记。连接对应的匹配的点。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV的库文件 #pragma comment lib "cv" #pragma comment lib "highgui" #pragma comment lib "cxcore" gsl的库文件 #pragma comment lib "libgsl a" #include "minpq h" #include "sift h" #include "imgfeatures h" #include "kdtree h" #include "utils h" #include "xform h" #include <cv h> #include <cxcore h> #include <highgui h> #include <stdio h> #include <iostream h> the maximum number of keypoint NN candidates to check during BBF search #define KDTREE BBF MAX NN CHKS 200 threshold on squared ratio of distances between NN and 2nd NN #define NN SQ DIST RATIO THR 0 49 Globals char img1 file[] " 1 bmp"; 怎么VC下一个点就够了的 net下需要两个点 char img2 file[] " 2 bmp"; double imgzoom scale 0 7; 显示匹配结果图的缩放比例 IplImage img1 img2 stacked; other functions 鼠标响应函数(用于根据鼠键响应缩放匹配结果的窗口大小) void on mouse int event int x int y int flags void param ; typedef char va list; #define INTSIZEOF n sizeof n + sizeof int 1 & sizeof int 1 #define va start ap v ap va list &v + INTSIZEOF v #define va end ap ap va list 0 void fatal error char format { va list ap; fprintf stderr "Error: " ; va start ap format ; vfprintf stderr format ap ; va end ap ; fprintf stderr " n" ; abort ; } extern IplImage stack imgs IplImage img1 IplImage img2 { IplImage stacked cvCreateImage cvSize MAX img1 >width img2 >width img1 >height + img2 >height IPL DEPTH 8U 3 ; cvZero stacked ; cvSetImageROI stacked cvRect 0 0 img1 >width img1 >height ; cvAdd img1 stacked stacked NULL ; cvSetImageROI stacked cvRect 0 img1 >height img2 >width img2 >height ; cvAdd img2 stacked stacked NULL ; cvResetImageROI stacked ; return stacked; } int sift features IplImage img struct feature feat { return sift features img feat SIFT INTVLS SIFT SIGMA SIFT CONTR THR SIFT CURV THR SIFT IMG DBL SIFT DESCR WIDTH SIFT DESCR HIST BINS ; }"> OpenCV的库文件 #pragma comment lib "cv" #pragma comment lib "highgui" #pragma comment lib "cxcore" gsl的库文件 #pragma comment lib "libgsl a" #include "minpq h" #include "sift h" #include [更多]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值