各位高手朋友您們好,最近要試著將尺度不變特徵轉換演算法〈SIFT,Scale-invariant feature transform〉以python實現,首先先請問各位有純python實現的完整程式碼可提供參考嗎?或者是麻煩您對以下我提出的幾段c程式碼片段,轉換成python寫法,麻煩您們了,不好意思。
(以下程式碼版權全部來自於http://blog.csdn.net/v_JULY_v)
主要對C語言的指標、結構、定義、opencv不太會轉換python,特來請教大家,請大家能夠盡量解答,若不方便的話,選擇幾段解答或者提供參考資料或網站也都可以,麻煩您們,萬分感謝。
//Data structure for a float image.
typedef struct ImageSt {
float levelsigma;
int levelsigmalength;
float absolute_sigma;
CvMat *Level; //CvMat是OPENCV的矩阵类,其元素可以是图像的象素值
} ImageLevels;
typedef struct ImageSt1 {
int row, col;
float subsample;
ImageLevels *Octave;
} ImageOctaves;
ImageOctaves *DOGoctaves;
ImageOctaves *mag_thresh ;
ImageOctaves *mag_pyr ;
ImageOctaves *grad_pyr ;
typedef struct KeypointSt
{
float row, col;
float sx,sy;
int octave,level;
float scale, ori,mag;
float *descrip;
struct KeypointSt *next;
} *Keypoint;
//定义特征点具体变量
Keypoint keypoints=NULL;
Keypoint keyDescriptors=NULL;
#define Im1Mat(ROW,COL) ((float *)(image1Mat->data.fl + image1Mat->step/sizeof(float) *(ROW)))[(COL)]
#define Im1G(ROW,COL) ((uchar*)(image1->imageData + image1->widthStep*(ROW)))[(COL)*3+1]
#define ImLevels(OCTAVE,LEVEL,ROW,COL) ((float *)(Gaussianpyr[(OCTAVE)].Octave[(LEVEL)].Level->data.fl + Gaussianpyr[(OCTAVE)].Octave[(LEVEL)].Level->step/sizeof(float) *(ROW)))[(COL)]
#define DST(ROW,COL) ((float *)(dst->data.fl + dst->step/sizeof(float) *(ROW)))[(COL)]
#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)))
for (int i=0; i<numoctaves;i++)
{
if (i==0)
{
mosaicHorizen1=MosaicHorizen( (Gaussianpyr[0].Octave)[0].Level, (Gaussianpyr[0].Octave)[1].Level );
for (int j=2;j<SCALESPEROCTAVE+3;j++)
mosaicHorizen1=MosaicHorizen( mosaicHorizen1, (Gaussianpyr[0].Octave)[j].Level );
for ( j=0;j<NUMSIZE;j++)
mosaicHorizen1=halfSizeImage(mosaicHorizen1);
}
else if (i==1)
{
mosaicHorizen2=MosaicHorizen( (Gaussianpyr[1].Octave)[0].Level, (Gaussianpyr[1].Octave)[1].Level );
for (int j=2;j<SCALESPEROCTAVE+3;j++)
mosaicHorizen2=MosaicHorizen( mosaicHorizen2, (Gaussianpyr[1].Octave)[j].Level );
for ( j=0;j<NUMSIZE;j++)
mosaicHorizen2=halfSizeImage(mosaicHorizen2);
mosaicVertical1=MosaicVertical( mosaicHorizen1, mosaicHorizen2 );
}
else
{
mosaicHorizen1=MosaicHorizen( (Gaussianpyr[i].Octave)[0].Level, (Gaussianpyr[i].Octave)[1].Level );
for (int j=2;j<SCALESPEROCTAVE+3;j++)
mosaicHorizen1=MosaicHorizen( mosaicHorizen1, (Gaussianpyr[i].Octave)[j].Level );
for ( j=0;j<NUMSIZE;j++)
mosaicHorizen1=halfSizeImage(mosaicHorizen1);
mosaicVertical1=MosaicVertical( mosaicVertical1, mosaicHorizen1 );
}
}
mosaic1 = cvCreateImage(cvSize(mosaicVertical1->width, mosaicVertical1->height), IPL_DEPTH_8U,1);
cvConvertScale( mosaicVertical1, mosaicVertical1, 255.0, 0 );
cvConvertScaleAbs( mosaicVertical1, mosaic1, 1, 0 );
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;
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);
}
}
}
octaves=(ImageOctaves*) malloc( numoctaves * sizeof(ImageOctaves) );
DOGoctaves=(ImageOctaves*) malloc( numoctaves * sizeof(ImageOctaves) );
printf("BuildGaussianOctaves(): Base image dimension is %dx%d\n", (int)(0.5*(image->cols)), (int)(0.5*(image->rows)) );
printf("BuildGaussianOctaves(): Building %d octaves\n", numoctaves);
// start with initial source image
tempMat=cvCloneMat( image );
// preblur_sigma = 1.0;//sqrt(2 - 4*INITSIGMA*INITSIGMA);
initial_sigma = sqrt(2);//sqrt( (4*INITSIGMA*INITSIGMA) + preblur_sigma * preblur_sigma );
// initial_sigma = sqrt(SIGMA * SIGMA - INITSIGMA * INITSIGMA * 4);
//在每一阶金字塔图像中建立不同的尺度图像
for ( i = 0; i < numoctaves; i++)
{
//首先建立金字塔每一阶梯的最底层,其中0阶梯的最底层已经建立好
printf("Building octave %d of dimesion (%d, %d)\n", i, tempMat->cols,tempMat->rows);
//为各个阶梯分配内存
octaves[i].Octave= (ImageLevels*) malloc( (SCALESPEROCTAVE + 3) * sizeof(ImageLevels) );
DOGoctaves[i].Octave= (ImageLevels*) malloc( (SCALESPEROCTAVE + 2) * sizeof(ImageLevels) );
//存储各个阶梯的最底层
(octaves[i].Octave)[0].Level=tempMat;
octaves[i].col=tempMat->cols;
octaves[i].row=tempMat->rows;
DOGoctaves[i].col=tempMat->cols;
DOGoctaves[i].row=tempMat->rows;
if (DOUBLE_BASE_IMAGE_SIZE)
octaves[i].subsample=pow(2,i)*0.5;
else
octaves[i].subsample=pow(2,i);
if(i==0)
{
(octaves[0].Octave)[0].levelsigma = initial_sigma;
(octaves[0].Octave)[0].absolute_sigma = initial_sigma;
printf("0 scale and blur sigma : %f \n", (octaves[0].subsample) * ((octaves[0].Octave)[0].absolute_sigma));
}
else
{
(octaves[i].Octave)[0].levelsigma = (octaves[i-1].Octave)[SCALESPEROCTAVE].levelsigma;
(octaves[i].Octave)[0].absolute_sigma = (octaves[i-1].Octave)[SCALESPEROCTAVE].absolute_sigma;
printf( "0 scale and blur sigma : %f \n", ((octaves[i].Octave)[0].absolute_sigma) );
}
(octaves[i].Octave)[j].levelsigma = sigma;
(octaves[i].Octave)[j].absolute_sigma = absolute_sigma;
//产生高斯层
int length=BlurImage((octaves[i].Octave)[j-1].Level, dst, sigma_f);//相应尺度
(octaves[i].Octave)[j].levelsigmalength = length;
(octaves[i].Octave)[j].Level=dst;
//产生DOG层
cvSub( ((octaves[i].Octave)[j]).Level, ((octaves[i].Octave)[j-1]).Level, temp, 0 );
// cvAbsDiff( ((octaves[i].Octave)[j]).Level, ((octaves[i].Octave)[j-1]).Level, temp );
((DOGoctaves[i].Octave)[j-1]).Level=temp;
}
// halve the image size for next iteration
tempMat = halfSizeImage( ( (octaves[i].Octave)[SCALESPEROCTAVE].Level ) );
float Dxx,Dyy,Dxy,Tr_H,Det_H,curvature_ratio;
Dxx = ImLevels(i,j,m,n-1) + ImLevels(i,j,m,n+1)-2.0*ImLevels(i,j,m,n);
Dyy = ImLevels(i,j,m-1,n) + ImLevels(i,j,m+1,n)-2.0*ImLevels(i,j,m,n);
Dxy = ImLevels(i,j,m-1,n-1) + ImLevels(i,j,m+1,n+1) - ImLevels(i,j,m+1,n-1) - ImLevels(i,j,m-1,n+1);
keypoint_count++;
Keypoint k;
/* Allocate memory for the keypoint. */
k = (Keypoint) malloc(sizeof(struct KeypointSt));
k->next = keypoints;
keypoints = k;
k->row = m*(GaussianPyr[i].subsample);
k->col =n*(GaussianPyr[i].subsample);
k->sy = m; //行
k->sx = n; //列
k->octave=i;
k->level=j;
k->scale = (GaussianPyr[i].Octave)[j].absolute_sigma;
ORI(m,n) =atan( TEMPMAT2(m,n)/TEMPMAT1(m,n) );
if (ORI(m,n)==CV_PI)
ORI(m,n)=-CV_PI;
}
((mag_pyr[i].Octave)[j-1]).Level=Mag;
((grad_pyr[i].Octave)[j-1]).Level=Ori;
Keypoint p = keypoints; // p指向第一个结点
while(p) // 没到表尾
{
int i=p->octave;
int j=p->level;
int m=p->sy; //行
int n=p->sx; //列
if ((m>=zero_pad)&&(m<GaussianPyr[i].row-zero_pad)&&
(n>=zero_pad)&&(n<GaussianPyr[i].col-zero_pad) )
{
float sigma=( ((GaussianPyr[i].Octave)[j].absolute_sigma) ) / (GaussianPyr[i].subsample);
//产生二维高斯模板
CvMat* mat = GaussianKernel2D( sigma );
int dim=(int)(0.5 * (mat->rows));
//分配用于存储Patch幅值和方向的空间
#define MAT(ROW,COL) ((float *)(mat->data.fl + mat->step/sizeof(float) *(ROW)))[(COL)]
//声明方向直方图变量
double* orienthist = (double *) malloc(36 * sizeof(double));
for ( int sw = 0 ; sw < 36 ; ++sw)
{
orienthist[sw]=0.0;
}
//在特征点的周围统计梯度方向
for (int x=m-dim,mm=0;x<=(m+dim);x++,mm++)
for(int y=n-dim,nn=0;y<=(n+dim);y++,nn++)
{
//计算特征点处的幅值
double dx = 0.5*(ImLevels(i,j,x,y+1)-ImLevels(i,j,x,y-1)); //dx
double dy = 0.5*(ImLevels(i,j,x+1,y)-ImLevels(i,j,x-1,y)); //dy
double mag = sqrt(dx*dx+dy*dy); //mag
//计算方向
double Ori =atan( 1.0*dy/dx );
int binIdx = FindClosestRotationBin(36, Ori); //得到离现有方向最近的直方块
orienthist[binIdx] = orienthist[binIdx] + 1.0* mag * MAT(mm,nn);//利用高斯加权累加进直
sample12=getPixelBI(((GaussianPyr[p->octave].Octave)[p->level]).Level, x_sample, y_sample-1);
CvMat* MosaicVertical( CvMat* im1, CvMat* im2 )
{
int row,col;
CvMat *mosaic = cvCreateMat(im1->rows+im2->rows,max(im1->cols,im2->cols), CV_32FC1);
#define Mosaic(ROW,COL) ((float*)(mosaic->data.fl + mosaic->step/sizeof(float)*(ROW)))[(COL)]
#define Im11Mat(ROW,COL) ((float *)(im1->data.fl + im1->step/sizeof(float) *(ROW)))[(COL)]
#define Im22Mat(ROW,COL) ((float *)(im2->data.fl + im2->step/sizeof(float) *(ROW)))[(COL)]
cvZero(mosaic);
/* Copy images into mosaic1. */
for ( row = 0; row < im1->rows; row++)
for ( col = 0; col < im1->cols; col++)
Mosaic(row,col)= Im11Mat(row,col) ;
for ( row = 0; row < im2->rows; row++)
for ( col = 0; col < im2->cols; col++)
Mosaic((row+im1->rows),col)=Im22Mat(row,col) ;
return mosaic;
}
问题补充:非常感謝您回應
但....有點不解
是利用C語言
的python.h
擴充python嗎
這樣django也可以利用到嗎
因主要還會用到django實現
方便 c程式轉換python幾段嗎 謝謝您
woods 写道
http://www.google.com/codesearch?hl=en&lr=&q=Scale-invariant+feature+transform+python&sbtn=Search
相关推荐
C语言与Python语言混合编程的接口设计主要是在电磁场工程参数提取的求解器开发中提出的。在这项工作中,为了结合C语言计算效率高和Python语言开发快速友好的用户图形界面(GUI)的优势,徐剑飞与薄亚明提出了利用...
C语言字符串转换为Python字符串的方法 C语言字符串转换为Python字符串是指将C语言中的字符串数据转换为Python中的字符串对象,以便在Python环境中使用。下面详细介绍了C语言字符串转换为Python字符串的方法。 使用...
### 用C语言扩展Python的功能:深度解析与实践 #### 引言 Python因其简洁的语法、丰富的标准库以及高效快速的开发周期,成为众多开发者首选的编程语言。然而,Python在执行速度上的劣势,尤其是在处理计算密集型...
标题中的"C语言实现的python里面的filtfilt函数"指的是在Python编程环境中通常使用的`scipy.signal.filtfilt`函数的一个C语言版本。这个函数是信号处理领域的重要工具,用于执行无后顾滤波(forward-backward ...
本资源“Ubuntu中c语言转Python.7z”显然关注的是如何在Ubuntu操作系统环境下将C语言程序转换为Python代码。这涉及到跨语言理解和迁移的过程,对程序员来说是一项有价值的技术挑战。 C语言是一种底层、高效的编程...
这是一个基于C语言和Python的嵌入式系统项目,主要用于读取模拟数字转换器(ADC)的温度数据并监控温度变化。项目包括一个C语言程序用于与嵌入式硬件交互,读取ADC数据,以及一个Python程序用于创建请求回复服务器以...
这些类型在C API中的表示和操作方式与Python代码中不同。 3. **创建Python模块**: 创建一个Python扩展模块通常涉及编写一个`.c`文件,该文件包含`PyMODINIT_FUNC`宏定义的初始化函数,例如`initmy_module()`。这...
对于D-S证据理论的实现,C语言提供了一种低级别的、高效的方式来处理数学计算,而Python则提供了丰富的库和易于理解的语法,适合快速原型开发和数据分析。 在C语言中,实现D-S证据理论可能涉及到对矩阵操作和算法...
### Python与C语言数据结构解析及构建 #### 标题解析 标题“Python与C语言数据结构解析与构建”表明本文旨在探讨如何在Python中处理源自C语言的数据结构。特别地,关注点在于如何通过Python的`struct`模块来解析和...
C语言编译器是将C源代码转换成机器可执行代码的程序,它解析源代码并生成等价的机器指令。在这个特殊的案例中,我们讨论的是一个使用Python编程语言实现的C语言编译器。这样的设计允许开发者用高级语言Python来理解...
在“标签”中提到了“python”和“c语言”,这表明cantools是用Python编写,同时它也支持生成C语言代码。Python因其简洁的语法和丰富的库资源,常被用于快速开发原型和工具,而C语言则因为其高效和对硬件的直接控制...
批量转换脚本完成后,你可以将它与你的项目源代码一起编译,这样就可以在目标系统上直接使用转换后的C语言数组来显示图片了。这种方法不仅提高了工作效率,而且避免了因手动转换带来的错误可能性。 总的来说,"IMG...
在使用C语言进行Python扩展时,需要了解如何在C语言和Python语言之间进行数据类型的转换。Python定义了六种基础数据类型:整型、浮点型、字符串、元组、列表和字典。在C语言中扩展Python时,需要使用Python C API...
C语言编译器(Python版)是一个创新的项目,它使用Python编程语言来实现一个能够解析和编译C语言源代码的工具。这样的编译器通常被称为“源到源”编译器,因为它将C语言的源代码转换为另一种形式的源代码,可能是...
C语言编译器是将C源代码转换成可执行程序的工具,而“C语言编译器(Python版)”则是使用Python编程语言实现的这样一个编译器。这个特殊的项目展示了如何利用Python来构建一个基本的编译器,这对于学习编译原理和...
Python-2.0.1是Python历史上的一个重要版本,它基于C语言实现,提供了高效的性能和跨平台的兼容性。在这个版本中,我们可以看到Python设计哲学的早期体现,以及其核心功能和架构的初步构建。 1. **Python的解释器**...
Python对象类型需要被转换成相应的C语言类型,并且在函数返回时,还要将C语言类型的结果转换回Python对象。 最后,文档中提及了如何在Windows平台上使用MSVC++编译Python扩展。建议在开发扩展模块时,首先阅读...
这个压缩包“傅里叶变换C语言实现以及python验证.zip”提供了C语言实现的傅里叶变换代码,并提供了Python环境下的验证方法,这对于学习和理解傅里叶变换原理及其应用非常有帮助。 1. **傅里叶变换基础** 傅里叶...
- **其他技术对比**:比较使用Psyco加速的Python版本、SWIG直接转换的C模块以及编译后的C语言程序的性能差异。 根据给定的数据,我们可以看到不同实现方法的时间消耗差异: - **纯Python**:耗时最长,达到了568....