0 0

C語言與Python的轉換15

各位高手朋友您們好,最近要試著將尺度不變特徵轉換演算法〈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

2011年4月24日 02:30

1个答案 按时间排序 按投票排序

0 0

http://www.google.com/codesearch?hl=en&lr=&q=Scale-invariant+feature+transform+python&sbtn=Search

2011年4月24日 17:23

相关推荐

    C语言字符串转换为Python字符串的方法

    主要介绍了C语言字符串转换为Python字符串的方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下

    cantools python语言 ,can dbc文件自动生成 excel 、C语言代码

    cantools python语言 ,can dbc文件自动生成 excel 、C语言代码

    C和Python使用栈结构实现进制转换

    分别用C语言和Python编写程序,使用栈结构实现十进制转换成二进制,并生成可执行程序

    汉字转utf8的C语言源码

    将汉字转为utf8编码的C语言源码 C语言不像PYTHON等高级语言,可以基本什么都不作,就实现 汉字转UTF8编码 可是我们C语言苦啊,啥都得写代码来实现 ,这是我总结的,给你,拿去用

    Extend_Python:C语言扩展Python学习记录

    Extend Python with C ...接收Python对象-&gt;转换为C对象-&gt;调用C函数-&gt;返回值转换为Python对象-&gt;返回 的流程,较为值得关切的几点是: 指针传参问题 数组传递问题 结构体传递问题 高级一点情况会考虑如何绕过GIL提升速度

    使用Python对IP进行转换的一些操作技巧小结

    Python Socket模块中包含一些有用IP转换函数,说明如下: socket.ntohl(x) // 类似于C语言的ntohl(x) 把32位正整数从网络序转换成主机字节序。 socket.ntohs(x) // 类似于C语言的ntohs(x) 把16位正整数从网络序...

    C2Py:轻松将 C 结构体转换为 Python!

    C2Py 可以帮助您将 C 结构和联合转换为具有相同字段、名称类型和所有内容的 Python 类! 但这还不是全部。 C2Py 可以接收字节缓冲区或内存转储以分配给结构的字段! 为什么要使用它? 该项目最有可能用于 C 项目的...

    图片转C语言数组软件

    如果用C语言编程,用一个点阵液晶来显示图片的时候,需要将图片转换成C语言数组后编译到目标代码里面,这个工具软件实现的就是这个功能。

    Python扩展C/C++库的方法(C转换为Python)

    故而将C库作为Python库的扩展极为必要,使得Python既融合了自身的优点,又融合了C语言的优点,正是因为这些性质使得Python越来越流行。 二、通过swing扩展C库 (1) 安装swig 命令: sudo apt-get install swig (2) ...

    Python语言基础.pdf

    本章知识点 2.1 常量和变量 2.2 运算符和表达式 2.3 常用语句 2.4 组合数据类型 2.1 常量和变量 2.1.1 常量 2.1.2 变量 2.1.3 常量与变量的数据类型转换 2.1.1 常量 l 常量是内存中用于保存固定值的单元, 在程序中...

    通达信day格式文件转换(含港股和基金等)

    把通达信day文件转换为csv文件,包含...采用c语言编写(含源代码),主要是不需要环境即可简单运行。如果需要其他格式或python对应文件,请私信联系。 各种格式说明可见本人文章:通达信日线day文件格式详解(含港股)

    烟雾报警系统C语言程序

    很好的程序谢谢支持,通过烟雾传感器检测再通过模数转换送给单片机。进行相应处理后通过12864显示。

    图片批量转换为C语言数组

    经常需要使用emWin的GUI Builder工具把图片转换为C语言数组,但这个工具每次只能添加一个图片文件,无法批量处理。就用Python写了一个批量转换的小工具。

    Python-ciso8601快速将ISO8601日期时间字符串转换为Python日期时间对象

    用C语言编写的用于Python的快速ISO8601日期时间解析器。由于它是作为C模块编写的,所以它比其他Python库快得多。 用Python 2.7 3.4 3.5测试。

    BLH与XYZ的转换

    用MFC实现了BLH到XYZ的相互转换,可批量和单点转换,简单式操作。

    用Cython加速Python到“起飞”(推荐)

    Cython是让Python脚本支持C语言扩展的编译器,Cython能够将Python+C混合编码的.pyx脚本转换为C代码,主要用于优化Python脚本性能或Python调用C函数库。由于Python固有的性能差的问题,用C扩展Python成为提高Python...

    Python 元组-元组和列表之间的转换

    Python解释器易于扩展,可以使用C语言或C++(或者其他可以通过C调用的语言)扩展新的功能和数据类型。Python也可用于可定制化软件中的扩展程序语言。Python丰富的标准库,提供了适用于各个主要系统平台的源码或机器...

    Python变量的输入输出-类型转换函数介绍

    Python解释器易于扩展,可以使用C语言或C++(或者其他可以通过C调用的语言)扩展新的功能和数据类型。Python也可用于可定制化软件中的扩展程序语言。Python丰富的标准库,提供了适用于各个主要系统平台的源码或机器...

    Python 2.5

    还有一些有趣的比如说,象下面的一个比较处理,用C语言为: &lt;br/&gt; &lt;br/&gt;if (2 &lt;br/&gt;用Python可以表示为 &lt;br/&gt;if (2 &lt;br/&gt; &lt;br/&gt;什么是Zope? &lt;br/&gt; &lt;br/&gt;Zope是一个开放源代码...

Global site tag (gtag.js) - Google Analytics