不适用 opencv 的代码(转)
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
#dene B(image,x,y) ((uchar *)(image->imageData+image->widthStep*(y)))[(x)*3]
#dene G(image,x,y) ((uchar *)(image->imageData+image->widthStep*(y)))[(x)*3+1]
#dene R(image,x,y) ((uchar *)(image->imageData+image->widthStep*(y)))[(x)*3+2]
#dene S(image,x,y) ((uchar *)(image->imageData+image->widthStep*(y)))[(x)]
//卷积计算求 Ix,Iy,以及滤波
//a 指向的数组是 size1*size2(滤波器大小)大小的...求导,a 指滤波器,xwidth,ywidth 指图像大小
px=i-size1/2+i1; py=j-size2/2+j1;分别消掉了 size1/2,size2/2,所以这样就更好理解了。
for(i=size1/2;i<ywidth-size1/2;i++)
for(j=size2/2;j<xwidth-size2/2;j++)
这里的 size/2 是为了不把图像边界算进去。
CvMat *mbys(CvMat *mat,int xwidth,int ywidth,double *a,int size1,int size2)//size
{
int i,j;
int i1,j1;
int px,py;
int m;
CvMat *mat1;
mat1=cvCloneMat(mat);
for(i=size1/2;i<ywidth-size1/2;i++)
for(j=size2/2;j<xwidth-size2/2;j++)
{
m=0;
for(i1=0;i1<size1;i1++)
for(j1=0;j1<size2;j1++)
{
px=i-size1/2+i1;
py=j-size2/2+j1;
//CV_MAT_ELEM 访问矩阵元素
m+=CV_MAT_ELEM(*mat,double,px,py)*a[i1*size1+j1];
}
CV_MAT_ELEM(*mat1,double,i,j)=m;
}
return mat1;
}
//计算 Ix2,Iy2,Ixy
CvMat *mbxy(CvMat *mat1,CvMat *mat2,int xwidth,int ywidth)
{
int i,j;
CvMat *mat3;