纯C语言实现harris角点检测,代码忽略高斯滤波部分
int sobel_kernel_x[9]={-1,0,1,-2,0,2,-1,0,1};
int sobel_kernel_y[9]={1,2,1,0,0,0,-1,-2,-1};
extern uchar sobel_res_x[1000*1000];
extern uchar sobel_res_y[1000*1000];
uchar xx[1000*1000];
uchar yy[1000*1000];
uchar xy[1000*1000];
void sobel_x(const imginfo img,uchar* res,int thread){
int width=img.width;
int height=img.height;
uchar* arr=(uchar *)malloc(sizeof(uchar)*width*height);
memcpy(arr,img.img, (sizeof(uchar)*width*height));
// res=(uchar *)malloc(sizeof(uchar)*width*height);
int i=0,j=0;
int sum=0;
for(i=3;i<width-3 ;i++){
for(j=3;j<height-3;j++){
sum=0;
sum =*(arr+i-1+(j-1)*width)*sobel_kernel_x[0]
+*(arr+i +(j-1)*width)*sobel_kernel_x[1]
+*(arr+i+1+(j-1)*width)*sobel_kernel_x[2]
+*(arr+i-1+(j)*width)*sobel_kernel_x[3]
+*(arr+i +(j )*width)*sobel_kernel_x[4]
+*(arr+i+1+(j)*width)*sobel_kernel_x[5]
+*(arr+i-1+(j+1)*width)*sobel_kernel_x[6]
+*(arr+i+(j+1)*width)*sobel_kernel_x[7]
+*(arr+i+1+(j+1)*width)*sobel_kernel_x[8];
sum=sum>255?255:sum;
sum=sum<thread?0:sum;
*(res+i+(j)*width)=sum;
}
}
}
void sobel_y(const imginfo img,uchar* res,int thread){
int width=img.width;
int height=img.height;
uchar* arr=(uchar *)malloc(sizeof(uchar)*width*height);
memcpy(arr,img.img, (sizeof(uchar)*width*height));
memset(res,0, (sizeof(uchar)*width*height));
int i=0,j=0;
int sum=0;
for(i=3;i<width-3 ;i++){
for(j=3;j<height-3;j++){
sum=0;
sum =*(arr+i-1+(j-1)*width)*sobel_kernel_y[0]
+*(arr+i +(j-1)*width)*sobel_kernel_y[1]
+*(arr+i+1+(j-1)*width)*sobel_kernel_y[2]
+*(arr+i-1+(j)*width)*sobel_kernel_y[3]
+*(arr+i +(j )*width)*sobel_kernel_y[4]
+*(arr+i+1+(j)*width)*sobel_kernel_y[5]
+*(arr+i-1+(j+1)*width)*sobel_kernel_y[6]
+*(arr+i+(j+1)*width)*sobel_kernel_y[7]
+*(arr+i+1+(j+1)*width)*sobel_kernel_y[8];
sum=sum>255?255:sum;
sum=sum<thread?0:sum;
*(res+i+(j)*width)=sum;
}
}
}
void harris(const imginfo img,uchar* res,int thread,int k){
sobel_y(img,sobel_res_y,10);
sobel_x(img,sobel_res_x,10);
double rr=0;
int i=0,j=0;
int width=img.width;
int height=img.height;
memcpy(res,img.img,sizeof(uchar)*width*height);
uchar tmp[1000*1000]={0};
long g_Ix=0,g_Iy=0,g_Ixy=0;
long a=0,b=0,c=0;
for(i=0;i<width;i++){
for(j=0;j<height;j++){
g_Ix=sobel_point_x(i,j,width) ;
g_Iy=sobel_point_y(i,j,width) ;
a= g_Ix>255?255:g_Ix;
b= g_Iy>255?255:g_Iy;
rr=double(a*a*b*b-k*(a*b+a*b));
*(xx+i+j*width)=a;
*(yy+i+j*width)=b;
rr=rr/10000000;
if(rr>thread ){
printf("rr=%f \r\n",rr);
}
if(rr>thread ){
*(res+i+j*width)=255;
*(res+i+1+j*width)=255;
*(res+i+(j+1)*width)=255;
*(res+i+(j-1)*width)=255;
*(res+i-1+j*width)=255;
}
}
}
}
原始图片
sobel_X sobel_Y
harris结果