C语言实现harris角点检测

纯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结果

 

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值