Has anyone implemented moravec corner detector in matlab??

조회 수: 3 (최근 30일)
B.k Sumedha
B.k Sumedha 2015년 5월 20일
답변: Ignacio Rocco 2019년 11월 14일
This is what i have tried.But with very less accurate.
clear all
close all
clc
tic
I=imread('panorama_image1.jpg');
originalmap=I;
w=5;
m=floor(size(I,1)/w);
n=floor(size(I,2)/w);
c=ceil(w/2)+(0:n-1)*w;
r=ceil(w/2)+(0:m-1)*w;
step=floor(w/2);
for y_unit=1:m
for x_unit=1:n
v1=0;v2=0;v3=0;v4=0;
for i=-step:step-1
v1=v1+(I(r(y_unit),c(x_unit)+i)-I(r(y_unit),c(x_unit)+i+1))^2;
v2=v2+(I(r(y_unit)+i,c(x_unit)+i)-I(r(y_unit)+i+1,c(x_unit)+i+1))^2;
v3=v3+(I(r(y_unit)+i,c(x_unit))-I(r(y_unit)+i+1,c(x_unit)))^2;
v4=v4+(I(r(y_unit)-i,c(x_unit)+i)-I(r(y_unit)-i-1,c(x_unit)+i+1))^2;
end
IV_cr(y_unit,x_unit)=min([v1,v2,v3,v4]);
end
end
exper_thr=20;
IV_cr(IV_cr<exper_thr)=NaN;
wf=9;
mf=floor(m/wf);
nf=floor(n/wf);
xc=[];
yc=[]; for y_unit=1:mf
for x_unit=1:nf
[C,I]=max(IV_cr((y_unit-1)*wf+1:y_unit*wf,(x_unit-1)*wf+1:x_unit*wf))
[C1,I1]=max(C);
IV_crch(y_unit,x_unit)=C1;
row=I(I1);
col=I1;
crch_row(y_unit,x_unit)=(y_unit-1)*wf+row;
crch_col(y_unit,x_unit)=(x_unit-1)*wf+col;
yc=[yc,r((y_unit-1)*wf+row)];xc=[xc,c((x_unit-1)*wf+col)];
IV_cr((y_unit-1)*wf+1:y_unit*wf,(x_unit-1)*wf+1:x_unit*wf)=NaN;
IV_cr((y_unit-1)*wf+row,(x_unit-1)*wf+col)=C1;
end
end
figure(1)
imshow(originalmap)
figure(2)
plot(xc,yc,'*')
view(0,-90)
toc;
t=toc;
disp(['amount of time',num2str(t),'sec'])
figure(3)
imshow(originalmap)
hold on
plot(xc,yc,'R*')
axis on
end

채택된 답변

Thorsten
Thorsten 2015년 5월 20일
I just did if for you:
function C = moravec(I)
%MORAVEC Moravec corner detector
%
% C = MORAVEC(I)
%
% Thorsten.Hansen@psychol.uni-giessen.de 2015-05-20
if nargin == 0 % simple test
I = zeros(100);
I(40:60, 40:60) = 1;
C = moravec(I);
imshow(0.5*C+I, [])
if nargout == 0, clear C, end
return
end
D(:,:,1) = diff([I I(:,end)]')';
D(:,:,2) = diff([I(:,1) I]')';
D(:,:,3) = diff([I; I(end,:)]);
D(:,:,4) = diff([I(1,:); I]);
C = sum(D.^2, 3);
if nargout == 0, clear C, end
  댓글 수: 12
Thorsten
Thorsten 2015년 5월 20일
편집: Thorsten 2015년 5월 20일
What do you mean by "Bad luck"? Does the result look strange, or do you get a Matlab error? The Moravec detector is highly sensitive to noise, so you get fine results for artificial images (run moravec without arguments to see an overlay of the image and the detected corners), but less so for natural images.

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Ignacio Rocco
Ignacio Rocco 2019년 11월 14일
Hi,
Thanks Thorsten for your code! However I think it's missing a few details. I slightly modified the implementation according to the original text by Moravec [1980], and I think now it's producing much better results.
Here's the updated code.
function C = moravec(I)
%MORAVEC Moravec corner detector
%
% C = MORAVEC(I)
%
% Thorsten.Hansen@psychol.uni-giessen.de 2015-05-20
% Ignacio.Rocco@inria.fr 2019-11-14
if nargin == 0 % simple test
I = zeros(100);
I(40:60, 40:60) = 1;
C = moravec(I);
imshow(0.5*C+I, [])
if nargout == 0, clear C, end
return
end
D(:,:,1) = conv2(conv2(single(I),[1 -1],'same').^2,ones(3),'same');
D(:,:,2) = conv2(conv2(single(I),[1;-1],'same').^2,ones(3),'same');
D(:,:,3) = conv2(conv2(single(I),[1 0;0 -1],'same').^2,ones(3),'same');
D(:,:,4) = conv2(conv2(single(I),[0 1;-1 0],'same').^2,ones(3),'same');
C = min(D.^2,[], 3);
if nargout == 0, clear C, end

카테고리

Help CenterFile Exchange에서 Feature Detection and Extraction에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by