资源简介
本原码是用C语言实现的SIFT算法,可以提取SIFT特征和利用SIFT特征进行图像拼接和全景图构造,只需进行一些简单的OPENCV配置,就可以顺利运行。
代码片段和文件信息
// SIFT.cpp : 定义控制台应用程序的入口点。
//
#include “stdafx.h“
#include“kdtree.h“
#include“minpq.h“
#include“utils.h“
#include“imgfeatures.h“
#include“xform.h“
#include“sift.h“
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
//在k-d树上进行BBF搜索的最大次数
/* the maximum number of keypoint NN candidates to check during BBF search */
#define KDTREE_BBF_MAX_NN_CHKS 200
//目标点与最近邻和次近邻的距离的比值的阈值,若大于此阈值,则剔除此匹配点对
//通常此值取0.6,值越小找到的匹配点对越精确,但匹配数目越少
/* threshold on squared ratio of distances between NN and 2nd NN */
#define NN_SQ_DIST_RATIO_THR 0.49
//窗口名字符串
#define IMG1 “图1“
#define IMG2 “图2“
#define IMG1_FEAT “图1特征点“
#define IMG2_FEAT “图2特征点“
#define IMG_MATCH1 “距离比值筛选后的匹配结果“
#define IMG_MATCH2 “RANSAC筛选后的匹配结果“
#define IMG_MOSAIC_TEMP “临时拼接图像“
#define IMG_MOSAIC_SIMPLE “简易拼接图“
#define IMG_MOSAIC_BEFORE_FUSION “重叠区域融合前“
#define IMG_MOSAIC_PROC “处理后的拼接图“
int open_image_number;//打开图片个数
IplImage *img1 *img2;//IplImage格式的原图
IplImage *img1_Feat *img2_Feat;//画上特征点之后的图
bool verticalStackFlag;//显示匹配结果的合成图像中,两张图是纵向排列的标志
IplImage *stacked;//显示匹配结果的合成图像,显示经距离比值法筛选后的匹配结果
IplImage *stacked_ransac;//显示匹配结果的合成图像,显示经RANSAC算法筛选后的匹配结果
struct feature *feat1 *feat2;//feat1:图1的特征点数组,feat2:图2的特征点数组
int n1 n2;//n1:图1中的特征点个数,n2:图2中的特征点个数
struct feature *feat;//每个特征点
struct kd_node *kd_root;//k-d树的树根
struct feature **nbrs;//当前特征点的最近邻点数组
CvMat * H;//RANSAC算法求出的变换矩阵
struct feature **inliers;//精RANSAC筛选后的内点数组
int n_inliers;//经RANSAC算法筛选后的内点个数即feat2中具有符合要求的特征点的个数
IplImage *xformed;//临时拼接图,即只将图2变换后的图
IplImage *xformed_simple;//简易拼接图
IplImage *xformed_proc;//处理后的拼接图
// int img1LeftBound;//图1中匹配点外接矩形的左边界
// int img1RightBound;//图1中匹配点外接矩形的右边界
// int img2LeftBound;//图2中匹配点外接矩形的左边界
// int img2RightBound;//图2中匹配点外接矩形的右边界
//图2的四个角经矩阵H变换后的坐标
CvPoint leftTop leftBottom rightTop rightBottom;
void CalcFourCorner() {
//计算图2的四个角经矩阵H变换后的坐标
double v2[] = { 001 };//左上角
double v1[3];//变换后的坐标值
CvMat V2 = cvMat(3 1 CV_64FC1 v2);
CvMat V1 = cvMat(3 1 CV_64FC1 v1);
cvGEMM(H &V2 1 0 1 &V1);//矩阵乘法
leftTop.x = cvRound(v1[0] / v1[2]);
leftTop.y = cvRound(v1[1] / v1[2]);
//cvCircle(xformedleftTop7CV_RGB(25500)2);
//将v2中数据设为左下角坐标
v2[0] = 0;
v2[1] = img2->height;
V2 = cvMat(3 1 CV_64FC1 v2);
V1 = cvMat(3 1 CV_64FC1 v1);
cvGEMM(H &V2 1 0 1 &V1);
leftBottom.x = cvRound(v1[0] / v1[2]);
leftBottom.y = cvRound(v1[1] / v1[2]);
//cvCircle(xformedleftBottom7CV_RGB(25500)2);
//将v2中数据设为右上角坐标
v2[0] = img2->width;
v2[1] = 0;
V2 = cvMat(3 1 CV_64FC1 v2);
V1 = cvMat(3 1 CV_64FC1 v1);
cvGEMM(H &V2 1 0 1 &V1);
rightTop.x = cvRound(v1[0] / v1[2]);
rightTop.y = cvRound(v1[1] / v1[2]);
//cvC
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
..A..H. 35328 2015-12-31 13:48 SIFT\.vs\SIFT\v14\.suo
文件 159744 2015-12-08 23:27 SIFT\Debug\SIFT.exe
文件 710992 2015-12-08 23:27 SIFT\Debug\SIFT.ilk
文件 2158592 2015-12-08 23:27 SIFT\Debug\SIFT.pdb
文件 3342336 2015-12-08 23:27 SIFT\ipch\SIFT-3a32c33c\SIFT-39e111a2.ipch
文件 3342336 2015-12-08 23:19 SIFT\ipch\SIFT-3a32c33c\SIFT-bb67ab9c.ipch
文件 49152 2015-12-30 20:32 SIFT\Release\SIFT.exe
文件 537539 2015-12-30 20:32 SIFT\Release\SIFT.iobj
文件 132464 2015-12-30 20:32 SIFT\Release\SIFT.ipdb
文件 1781760 2015-12-30 20:32 SIFT\Release\SIFT.pdb
文件 4685 2015-12-08 23:27 SIFT\SIFT\Debug\SIFT.log
文件 572254 2015-12-08 23:27 SIFT\SIFT\Debug\SIFT.obj
文件 3407872 2015-12-08 23:27 SIFT\SIFT\Debug\SIFT.pch
文件 1810 2015-12-08 23:27 SIFT\SIFT\Debug\SIFT.tlog\CL.command.1.tlog
文件 18744 2015-12-08 23:27 SIFT\SIFT\Debug\SIFT.tlog\CL.read.1.tlog
文件 1402 2015-12-08 23:27 SIFT\SIFT\Debug\SIFT.tlog\CL.write.1.tlog
文件 2432 2015-12-08 23:27 SIFT\SIFT\Debug\SIFT.tlog\li
文件 5160 2015-12-08 23:27 SIFT\SIFT\Debug\SIFT.tlog\li
文件 756 2015-12-08 23:27 SIFT\SIFT\Debug\SIFT.tlog\li
文件 190 2015-12-08 23:27 SIFT\SIFT\Debug\SIFT.tlog\SIFT.lastbuildstate
文件 11967 2015-12-08 23:27 SIFT\SIFT\Debug\stdafx.obj
文件 732160 2015-12-08 23:27 SIFT\SIFT\Debug\vc140.idb
文件 1544192 2015-12-08 23:27 SIFT\SIFT\Debug\vc140.pdb
文件 30625 2012-07-26 14:48 SIFT\SIFT\IMG1.png
文件 19484 2012-07-26 14:48 SIFT\SIFT\IMG2.png
文件 20269 2015-12-10 09:32 SIFT\SIFT\imgfeatures.h
文件 22965 2015-12-08 22:05 SIFT\SIFT\kdtree.h
文件 5839 2015-12-08 22:05 SIFT\SIFT\minpq.h
文件 1489 2015-12-08 15:19 SIFT\SIFT\ReadMe.txt
文件 1135 2015-12-08 21:04 SIFT\SIFT\Release\SIFT.Build.CppClean.log
............此处省略42个文件信息
- 上一篇:C#封装C++DLL并调用
- 下一篇:mfc编程共85个
相关资源
- C++运用opencv进行二维多张全景图拼接
- opencv+MFC实现图像拼接
- 纯C语言写的sift算法,亲测,可用,可
- 基于块匹配的图像拼接 源码,C++实现
- sift算法C++opencv实现代码
- sift算法的C源码(网上唯一原创版本不
- sift-surf-orb通用程序
- BOW+SIFT特征提取OpenCV实现
- surfsift算法配准,利用Ransac去除误匹配
- 全景图像拼接程序源代码VC++
- 图像拼接使用VC++实现完成两幅又重叠
- SIFT代码,C/C++
- 全景图像拼接
- Opencv3中SIFT算法详解
- yuv编解码(2x2 YUV图像拼接)
- OpenCV图像拼接项目
- c++ 图像拼接
评论
共有 条评论