📄 corner_detector.m
字号:
function feature_list = corner_detector (A_img,n)
% function feature_list = corner_detector (image,n)
% image as obtained by im=imread('filename');
% n is the desired number of features
if nargin<2
n=1000;
end
percentage_overall=20/100;
s=size(A_img);
pix_per_region=s(1)*s(2)/36;
n_hor_region=round(s(2)/sqrt(pix_per_region));
n_vert_region=round(s(1)/sqrt(pix_per_region));
region_w=s(2)/n_hor_region;
region_h=s(1)/n_vert_region;
features_per_region=round(n*(1-percentage_overall)/36);
strongest_features_overall = n - 36*features_per_region;
min_threshold_in_percentage = 1/10; % to be a feature, its value has to be over this percentage among all features in the image
show_resulting_img = 0; % 1: show the resulting img; 0 : don't show
%input image
%A_img = imread(img_file);
img_h = size(A_img,1);
img_w = size(A_img,2);
A = double(rgb2gray(A_img));
%parameters for the gaussian
gaussian_size = 7;
sigma = .7;
%feature window calculation
del_A_1 = conv2(A,[-1,1],'same') ;
del_A_2 = conv2(A,[-1;1],'same') ;
del_A_1_1 = del_A_1 .* del_A_1;
del_A_2_2 = del_A_2 .* del_A_2;
del_A_1_2 = del_A_1 .* del_A_2;
gaussian = fspecial('gaussian',gaussian_size,sigma);
matrix_1_1 = conv2(del_A_1_1,gaussian,'same');
matrix_2_2 = conv2(del_A_2_2,gaussian,'same');
matrix_1_2 = conv2(del_A_1_2,gaussian,'same');
to_i = img_h+1-gaussian_size;
to_j = img_w+1-gaussian_size;
k = 0.04;
R = zeros(img_h,img_w);
length_L = to_i*to_j;
L = zeros(length_L,3);
ind_L = 1;
for i= 1:to_i
for j=1:to_j
M = [matrix_1_1(i,j),matrix_1_2(i,j);
matrix_1_2(i,j),matrix_2_2(i,j)];
tM = trace(M);
dM = det(M);
R(i,j) = dM-k*tM^2; %min(abs(eig(M)));
% L(ind_L,1) = R(i,j); %min(abs(eig(M)));
% L(ind_L,2) = round(i);
% L(ind_L,3) = round(j);
% ind_L = ind_L + 1;
end
end
for i= 2:to_i-1
for j=2:to_j-1
% R(i,j) = dM-k*tM^2; %min(abs(eig(M)));
if (R(i,j)==max(max(R(i-1:i+1,j-1:j+1))))
L(ind_L,1) = R(i,j); %min(abs(eig(M)));
L(ind_L,2) = round(i);
L(ind_L,3) = round(j);
ind_L = ind_L + 1;
end
end
end
ind_L;
%find features
feature_index=1;
is_not_a_feature = ones(img_h,img_w);
[sorted_L_1, sorted_ind] = sort(L,1);
min_threshold = L(sorted_ind(ceil(length_L*min_threshold_in_percentage)),1);
region = zeros(ceil(img_h/region_h), ceil(img_w/region_w));
total_num_region = ceil(img_h/region_h)*ceil(img_w/region_w)*features_per_region;
counter_total_region = 0;
for i = 1:length_L
elem = sorted_ind(length_L-i+1);
m = L(elem,2);
n = L(elem,3);
if i <= strongest_features_overall
is_not_a_feature(m,n) = 0;
feature_list(feature_index,1:2)= [m n];
feature_index = feature_index + 1;
else
p = ceil(m/region_h);
q = ceil(n/region_w);
if p == 0 | q == 0
continue;
end
if region(p,q) < features_per_region
region(p,q) = region(p,q) +1;
if L(elem,1) > min_threshold
is_not_a_feature(m,n) = 0;
feature_list(feature_index,1:2)= [m n];
feature_index = feature_index + 1;
end
counter_total_region = counter_total_region +1;
if counter_total_region >= total_num_region
break;
end
end
end
end
if show_resulting_img == 1
hA = imshow(uint8(A.*is_not_a_feature));
end
return;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -