#include "MySift.h"
MySift::MySift() {
}
MySift::~MySift() {
//释放图像
cvReleaseImage(&image_kp);
cvReleaseImage(&image_featDir);
cvReleaseImage(&grey_im1);
cvReleaseImage(&mosaic1);
cvReleaseImage(&mosaic2);
}
MySift::MySift(char* _filename, int _isColor) {
filename = _filename;
isColor = _isColor;
}
//下采样原来的图像,返回缩小2倍尺寸的图像
CvMat * MySift::halfSizeImage(CvMat * im) {
unsigned int i, j;
int w = im->cols / 2;
int h = im->rows / 2;
CvMat *imnew = cvCreateMat(h, w, CV_32FC1);
#define Im(ROW,COL) ((float *)(im->data.fl + im->step/sizeof(float) *(ROW)))[(COL)]
#define Imnew(ROW,COL) ((float *)(imnew->data.fl + imnew->step/sizeof(float) *(ROW)))[(COL)]
for (j = 0; j < h; j++)
for (i = 0; i < w; i++)
Imnew(j, i) = Im(j * 2, i * 2);
return imnew;
}
//上采样原来的图像,返回放大2倍尺寸的图像
CvMat * MySift::doubleSizeImage(CvMat * im) {
unsigned int i, j;
int w = im->cols * 2;
int h = im->rows * 2;
CvMat *imnew = cvCreateMat(h, w, CV_32FC1);
#define Im(ROW,COL) ((float *)(im->data.fl + im->step/sizeof(float) *(ROW)))[(COL)]
#define Imnew(ROW,COL) ((float *)(imnew->data.fl + imnew->step/sizeof(float) *(ROW)))[(COL)]
for (j = 0; j < h; j++)
for (i = 0; i < w; i++)
Imnew(j, i) = Im(j / 2, i / 2);
return imnew;
}
//上采样原来的图像,返回放大2倍尺寸的线性插值图像
CvMat * MySift::doubleSizeImage2(CvMat * im) {
unsigned int i, j;
int w = im->cols * 2;
int h = im->rows * 2;
CvMat *imnew = cvCreateMat(h, w, CV_32FC1);
#define Im(ROW,COL) ((float *)(im->data.fl + im->step/sizeof(float) *(ROW)))[(COL)]
#define Imnew(ROW,COL) ((float *)(imnew->data.fl + imnew->step/sizeof(float) *(ROW)))[(COL)]
// fill every pixel so we don't have to worry about skipping pixels later
for (j = 0; j < h; j++) {
for (i = 0; i < w; i++) {
Imnew(j, i) = Im(j / 2, i / 2);
}
}
/*
A B C
E F G
H I J
pixels A C H J are pixels from original image
pixels B E G I F are interpolated pixels
*/
// interpolate pixels B and I
for (j = 0; j < h; j += 2)
for (i = 1; i < w - 1; i += 2)
Imnew(j, i) = 0.5*(Im(j / 2, i / 2) + Im(j / 2, i / 2 + 1));
// interpolate pixels E and G
for (j = 1; j < h - 1; j += 2)
for (i = 0; i < w; i += 2)
Imnew(j, i) = 0.5*(Im(j / 2, i / 2) + Im(j / 2 + 1, i / 2));
// interpolate pixel F
for (j = 1; j < h - 1; j += 2)
for (i = 1; i < w - 1; i += 2)
Imnew(j, i) = 0.25*(Im(j / 2, i / 2) + Im(j / 2 + 1, i / 2) + Im(j / 2, i / 2 + 1) + Im(j / 2 + 1, i / 2 + 1));
return imnew;
}
//双线性插值,返回像素间的灰度值
float MySift::getPixelBI(CvMat * im, float col, float row) {
int irow, icol;
float rfrac, cfrac;
float row1 = 0, row2 = 0;
int width = im->cols;
int height = im->rows;
#define ImMat(ROW,COL) ((float *)(im->data.fl + im->step/sizeof(float) *(ROW)))[(COL)]
irow = (int)row;
icol = (int)col;
if (irow < 0 || irow >= height
|| icol < 0 || icol >= width)
return 0;
if (row > height - 1)
row = height - 1;
if (col > width - 1)
col = width - 1;
rfrac = 1.0 - (row - (float)irow);
cfrac = 1.0 - (col - (float)icol);
if (cfrac < 1) {
row1 = cfrac * ImMat(irow, icol) + (1.0 - cfrac) * ImMat(irow, icol + 1);
}
else {
row1 = ImMat(irow, icol);
}
if (rfrac < 1) {
if (cfrac < 1) {
row2 = cfrac * ImMat(irow + 1, icol) + (1.0 - cfrac) * ImMat(irow + 1, icol + 1);
}
else {
row2 = ImMat(irow + 1, icol);
}
}
return rfrac * row1 + (1.0 - rfrac) * row2;
}
//矩阵归一化
void MySift::normalizeMat(CvMat* mat)
{
#define Mat(ROW,COL) ((float *)(mat->data.fl + mat->step/sizeof(float) *(ROW)))[(COL)]
float sum = 0;
for (unsigned int j = 0; j < mat->rows; j++)
for (unsigned int i = 0; i < mat->cols; i++)
sum += Mat(j, i);
for (int j = 0; j < mat->rows; j++)
for (unsigned int i = 0; i < mat->rows; i++)
Mat(j, i) /= sum;
}
//向量归一化
void MySift::normalizeVec(float* vec, int dim)
{
unsigned int i;
float sum = 0;
for (i = 0; i < dim; i++)
sum += vec[i];
for (i = 0; i < dim; i++)
vec[i] /= sum;
}
//得到向量的欧式长度,2-范数
float GetVectorNorm(float* vec, int dim)
{
float sum = 0.0;
for (unsigned int i = 0; i<dim; i++)
sum += vec[i] * vec[i];
return sqrt(sum);
}
//产生1D高斯核
float* MySift::GaussianKernel1D(float sigma, int dim)
{
unsigned int i;
//printf("GaussianKernel1D(): Creating 1x%d vector for sigma=%.3f gaussian kernel/n", dim, sigma);
float *kern = (float*)malloc(dim*sizeof(float));
float s2 = sigma * sigma;
int c = dim / 2;
float m = 1.0 / (sqrt(2.0 * CV_PI) * sigma);
double v;
for (i = 0; i < (dim + 1) / 2; i++)
{
v = m * exp(-(1.0*i*i) / (2.0 * s2));
kern[c + i] = v;
kern[c - i] = v;
}
// normalizeVec(kern, dim);
// for ( i = 0; i < dim; i++)
// printf("%f ", kern[i]);
// printf("/n");
return kern;
}
//产生2D高斯核矩阵
CvMat* MySift::GaussianKernel2D(float sigma)
{
// int dim = (int) max(3.0f, GAUSSKERN * sigma);
int dim = (int)max(3.0f, 2.0 * GAUSSKERN *sigma + 1.0f);
// make dim odd
if (dim % 2 == 0)
dim++;
//printf("GaussianKernel(): Creating %dx%d matrix for sigma=%.3f gaussian/n", dim, dim, sigma);
CvMat* mat = cvCreateMat(dim, dim, CV_32FC1);
#define Mat(ROW,COL) ((float *)(mat->data.fl + mat->step/sizeof(float) *(ROW)))[(COL)]
float s2 = sigma * sigma;
int c = dim / 2;
//printf("%d %d/n", mat.size(), mat[0].size());
float m = 1.0 / (sqrt(2.0 * CV_PI) * sigma);
for (int i = 0; i < (dim + 1) / 2; i++)
{
for (int j = 0; j < (dim + 1) / 2; j++)
{
//printf("%d %d %d/n", c, i, j);
float v = m * exp(-(1.0*i*i + 1.0*j*j) / (2.0 * s2));
Mat(c + i, c + j) = v;
Mat(c - i, c + j) = v;
Mat(c + i, c - j) = v;
Mat(c - i, c - j) = v;
}
}
// normalizeMat(mat);
return mat;
}
//x方向像素处作卷积
float MySift::ConvolveLocWidth(float* kernel, int dim, CvMat * src, int x, int y)
{
#define Src(ROW,COL) ((float *)(src->data.fl + src->step/sizeof(float) *(ROW)))[(COL)]
unsigned int i;
float pixel = 0;
int col;
int cen = dim / 2;
//printf("ConvolveLoc(): Applying convoluation at location (%d, %d)/n", x, y);
for (i = 0; i < dim; i++)
{
col = x + (i - cen);
if (col < 0)
col = 0;
if (col >= src->cols)
col = src->cols - 1;
pixel += kernel[i] * Src(y, col);
}
if (pixel > 1)
pixel = 1;
return pixel;
}
//x方向作卷积
void MySift::Convolve1DWidth(float* kern, int dim, CvMat * src, CvMat * dst)
{
#define DST(ROW,COL) ((float *)(dst->data.fl + dst->step/sizeof(float) *(ROW)))[(COL)]
unsigned int i, j;
for (j = 0; j < src->rows; j++)
{
for (i = 0; i < src->cols; i++)
{
//printf("%d, %d/n", i, j);
DST(j, i) = ConvolveLocWidth(kern, dim, src, i, j);
}
}
}
//y方向像素处作卷积
float MySift::ConvolveLocHeight(float* kernel, int dim, CvMat * src, int x, int y)
{
#define Src(ROW,COL) ((float *)(src->data.fl + src->step/sizeof(float) *(ROW)))[(COL)]
unsigned int j;
float pixel = 0;
int cen = dim / 2;
//printf("ConvolveLoc(): Applying convoluation at location (%d, %d)/n", x, y);
for (j = 0; j < dim; j++)
{
int row = y + (j - cen);
if (row < 0)
row = 0;
if (row >= src->rows)
row = src->rows - 1;
pixel += kernel[j] * Src(row, x);
}
if (pixel > 1)
pixel = 1;
return pixel;
}
//y方向作卷积
void MySift::Convolve1DHeight(float* kern, int dim, CvMat * src, CvMat * dst)
{
#define Dst(ROW,COL) ((float *)(dst->data.fl + dst->step/sizeof(float) *(ROW)))[(COL)]
unsigned int i, j;
for (j = 0; j < src->rows; j++)
{
for (i = 0; i < src->cols; i++)
{
//printf("%d, %d/n", i, j);
Dst(j, i) = ConvolveLocHeight(kern, dim, src, i, j);
}
}
}
//卷积模糊图像
int MySift::BlurImage(CvMat * src, CvMat * dst, float sigma)
{
float* convkernel;
int dim = (int)max(3.0f, 2.0 * GAUSSKERN * sigma + 1.0f);
CvMat *tempMat;
// make dim odd
if (dim % 2 == 0)
dim++;
tempMat = cvCreateMat(src->rows, src->cols, CV_32FC1);
convkernel = GaussianKernel1D(sigma, dim);
Convolve1DWidth(convkernel, dim, src, tempMat);
Convolve1DHeight(convkernel, d
没有合适的资源?快使用搜索试试~ 我知道了~
图像拼接中的Sift算法 不应用opencv库自己实现
共37个文件
tlog:6个
h:6个
cpp:5个
需积分: 31 13 下载量 7 浏览量
2018-11-26
15:06:55
上传
评论 3
收藏 15.4MB RAR 举报
温馨提示
C语言实现SIFT算法 亲测可用要实现一个算法,首先要完全理解这个算法的原理或思想 sift,尺度不变特征转换,是一种电脑视觉的算法用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由 David Lowe 在1999年所发表,2004年完善总结。 所谓,Sift算法就是用不同尺度(标准差)的高斯函数对图像进行平滑,然后比较平滑后图像的差别, 差别大的像素就是特征明显的点。
资源推荐
资源详情
资源评论
收起资源包目录
C语言实现SIFT算法.rar (37个子文件)
C语言实现SIFT算法
.vs
C语言实现SIFT算法
v14
.suo 43KB
C语言实现SIFT算法.sln 1KB
C语言实现SIFT算法.VC.db 45.13MB
x64
Debug
C语言实现SIFT算法.ilk 2.21MB
C语言实现SIFT算法.pdb 4.43MB
C语言实现SIFT算法.exe 2.46MB
C语言实现SIFT算法
Output
stdafx.cpp 201B
CImg.h 2.6MB
MyBlending.h 585B
3.bmp 576KB
stdafx.h 218B
1.bmp 576KB
4.bmp 576KB
C语言实现SIFT算法.vcxproj.filters 2KB
MyBlending.cpp 4KB
targetver.h 485B
MySift.h 5KB
2.bmp 576KB
x64
Debug
MySift.obj 168KB
vc140.pdb 2.25MB
stdafx.obj 4KB
C语言实现SIFT算法.log 4KB
vc140.idb 1.81MB
MyBlending.obj 5.06MB
C语言实现SIFT算法.tlog
CL.write.1.tlog 5KB
CL.read.1.tlog 107KB
unsuccessfulbuild 0B
CL.command.1.tlog 7KB
link.write.1.tlog 1KB
link.command.1.tlog 5KB
C语言实现SIFT算法.lastbuildstate 219B
link.read.1.tlog 4KB
main.cpp 1KB
MySift.cpp 44KB
MyMatching.h 1KB
MyMatching.cpp 8KB
C语言实现SIFT算法.vcxproj 8KB
共 37 条
- 1
资源评论
LKE1995
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功