基于Harris原理的亚像素角点坐标检测Matlab程序.docx
- 文档编号:30240246
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:44
- 大小:26.06KB
基于Harris原理的亚像素角点坐标检测Matlab程序.docx
《基于Harris原理的亚像素角点坐标检测Matlab程序.docx》由会员分享,可在线阅读,更多相关《基于Harris原理的亚像素角点坐标检测Matlab程序.docx(44页珍藏版)》请在冰豆网上搜索。
基于Harris原理的亚像素角点坐标检测Matlab程序
基于Harris原理的亚像素角点坐标检测Matlab程序
★注意:
直接运行click_calib.m文件即可获得亚像素级角点坐标,附录Ⅱ中的其它函数文件均会被click_calib.m文件调用。
click_calib.m
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%测量亚像素角点坐标的主函数
var2fix='dX_default';
fixvariable;%调用fixvariable.m文件,修正变量
var2fix='dY_default';
fixvariable;
var2fix='map';
fixvariable;
if~exist('n_ima'),
data_calib;%调用data_calib.m文件,输入图像名和格式,%检查文件中的图像并读取标定图像信息
end;
check_active_images;%调用check_active_images.m文件,检查是%否已读取到标定图像
if~exist(['I_'num2str(ind_active
(1))]),
ima_read_calib;
ifisempty(ind_read),
disp('Cannotextractcornerswithoutimages');
return;
end;
end;
fprintf(1,'\nExtractionofthegridcornersontheimages\n');
if(exist('map')~=1),map=gray(256);
end;
ifexist('dX'),
dX_default=dX;
end;
ifexist('dY'),
dY_default=dY;
end;
ifexist('n_sq_x'),
n_sq_x_default=n_sq_x;
end;
ifexist('n_sq_y'),
n_sq_y_default=n_sq_y;
end;
if~exist('dX_default')|~exist('dY_default');
dX_default=30;
dY_default=30;%设靶标平面X和Y方向上方格的默认距离%为30mm
end;
if~exist('n_sq_x_default')|~exist('n_sq_y_default'),
n_sq_x_default=10;
n_sq_y_default=10;%设在靶标平面的x和y方向上提取的角点%数的默认值均为10
end;
if~exist('wintx_default')|~exist('winty_default'),
wintx_default=max(round(nx/128),round(ny/96));
winty_default=wintx_default;
clearwintxwinty
end;
if~exist('wintx')|~exist('winty'),
clear_windows;%调用clear_windows.m文件,清除窗口
end;
if~exist('dont_ask'),
dont_ask=0;
end;
if~dont_ask,
ima_numbers=input('Number(s)ofimage(s)toprocess([]=allimages)=');
else
ima_numbers=[];
end;
ifisempty(ima_numbers),
ima_proc=1:
n_ima;
else
ima_proc=ima_numbers;
end;
kk_first=ima_proc
(1);%输入('Startimagenumber([]=1=first):
');
ifexist(['wintx_'num2str(kk_first)]),
eval(['wintxkk=wintx_'num2str(kk_first)';']);
ifisempty(wintxkk)|isnan(wintxkk),
disp('Windowsizeforcornerfinder(wintxandwinty):
');
wintx=input(['wintx([]='num2str(wintx_default)')=']);
ifisempty(wintx),wintx=wintx_default;end;
wintx=round(wintx);
winty=input(['winty([]='num2str(winty_default)')=']);
ifisempty(winty),winty=winty_default;end;
winty=round(winty);
fprintf(1,'Windowsize=%dx%d\n',2*wintx+1,2*winty+1);
end;
else
disp('Windowsizeforcornerfinder(wintxandwinty):
');
wintx=input(['wintx([]='num2str(wintx_default)')=']);
ifisempty(wintx),wintx=wintx_default;end;
wintx=round(wintx);
winty=input(['winty([]='num2str(winty_default)')=']);
ifisempty(winty),winty=winty_default;end;
winty=round(winty);
fprintf(1,'Windowsize=%dx%d\n',2*wintx+1,2*winty+1);
end;
if~dont_ask,
fprintf(1,'Doyouwanttousetheautomaticsquarecountingmechanism(0=[]=default)\n');
manual_squares=input('ordoyoualwayswanttoenterthenumberofsquaresmanually(1,other)?
');
ifisempty(manual_squares),
manual_squares=0;
else
manual_squares=~~manual_squares;
end;
else
manual_squares=0;
end;
forkk=ima_proc,
ifexist(['I_'num2str(kk)]),
click_ima_calib;%调用click_ima_calib.m文件,点击图像边%界的4个顶点,从而划出边线
active_images(kk)=1;
else
eval(['dX_'num2str(kk)'=NaN;']);
eval(['dY_'num2str(kk)'=NaN;']);
eval(['wintx_'num2str(kk)'=NaN;']);
eval(['winty_'num2str(kk)'=NaN;']);
eval(['x_'num2str(kk)'=NaN*ones(2,1);']);
eval(['X_'num2str(kk)'=NaN*ones(3,1);']);
eval(['n_sq_x_'num2str(kk)'=NaN;']);
eval(['n_sq_y_'num2str(kk)'=NaN;']);
end;
end;
check_active_images;
forkk=1:
n_ima,
if~exist(['x_'num2str(kk)]),
eval(['dX_'num2str(kk)'=NaN;']);
eval(['dY_'num2str(kk)'=NaN;']);
eval(['x_'num2str(kk)'=NaN*ones(2,1);']);
eval(['X_'num2str(kk)'=NaN*ones(3,1);']);
eval(['n_sq_x_'num2str(kk)'=NaN;']);
eval(['n_sq_y_'num2str(kk)'=NaN;']);
end;
if~exist(['wintx_'num2str(kk)])|~exist(['winty_'num2str(kk)]),
eval(['wintx_'num2str(kk)'=NaN;']);
eval(['winty_'num2str(kk)'=NaN;']);
end;
end;
string_save='savecalib_dataactive_imagesind_activewintxwintyn_imatype_numberingN_slotsfirst_numimage_numbersformat_imagecalib_nameHcalWcalnxnymapdX_defaultdY_defaultdXdYwintx_defaultwinty_default';
forkk=1:
n_ima,
string_save=[string_save'X_'num2str(kk)'x_'num2str(kk)'n_sq_x_'num2str(kk)'n_sq_y_'num2str(kk)'wintx_'num2str(kk)'winty_'num2str(kk)'dX_'num2str(kk)'dY_'num2str(kk)];
end;
eval(string_save);
disp('done');
forlamp=1:
Nima_valid
dog1=['x_'num2str(lamp)];
name1=['x'num2str(lamp)'.txt'];
save(name1,dog1,'-ascii');
dog2=['X_'num2str(lamp)];
name2=['M'num2str(lamp)'.txt'];
save(name2,dog2,'-ascii');
end
return;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
fixvariable.m
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%修正变量
ifexist('var2fix')==1,
ifeval(['exist('''var2fix''')==1']),
ifeval(['isempty('var2fix')']),
eval(['clear'var2fix]);
else
ifeval(['~isstruct('var2fix')']),
ifeval(['~iscell('var2fix')']),
ifeval(['isnan('var2fix'
(1))']),
eval(['clear'var2fix]);
end;
end;
end;
end;
end;
end;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
data_calib.m
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%人工输入图像基名和格式,寻找、读取并显示出所有标定图像
l_ras=dir('*ras');
s_ras=size(l_ras,1);
l_bmp=dir('*bmp');
s_bmp=size(l_bmp,1);
l_tif=dir('*tif');
s_tif=size(l_tif,1);
l_pgm=dir('*pgm');
s_pgm=size(l_pgm,1);
l_ppm=dir('*ppm');
s_ppm=size(l_ppm,1);
l_jpg=dir('*jpg');
s_jpg=size(l_jpg,1);
s_tot=s_ras+s_bmp+s_tif+s_pgm+s_jpg+s_ppm;
ifs_tot<1,
fprintf(1,'Noimageinthisdirectoryineitherras,bmp,tif,pgm,ppmorjpgformat.Changedirectoryandtryagain.\n');
break;
end;
dir;
Nima_valid=0;
while(Nima_valid==0),
fprintf(1,'\n');
calib_name=input('Basenamecameracalibrationimages(withoutnumbernorsuffix):
','s');%输入图像基名
format_image='0';
whileformat_image=='0',
format_image=input('Imageformat:
([]=''r''=''ras'',''b''=''bmp'',''t''=''tif'',''p''=''pgm'',''j''=''jpg'',''m''=''ppm'')','s');%输入图像格式
ifisempty(format_image),
format_image='ras';
end;
iflower(format_image
(1))=='m',
format_image='ppm';
else
iflower(format_image
(1))=='b',
format_image='bmp';
else
iflower(format_image
(1))=='t',
format_image='tif';
else
iflower(format_image
(1))=='p',
format_image='pgm';
else
iflower(format_image
(1))=='j',
format_image='jpg';
else
iflower(format_image
(1))=='r',
format_image='ras';
else
disp('Invalidimageformat');
format_image='0';%Askforformatonceagain
end;
end;
end;
end;
end;
end;
end;
check_directory;%调用check_directory.m文件,按图像基名%和格式检查文件中的图像
end;
if(Nima_valid~=0),
ima_read_calib;%调用ima_read_calib.m文件,读取图像
if~isempty(ind_read),
mosaic;%调用mosaic.m文件,显示所有的标定图像
end;
end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
check_directory.m
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%检查文件中是否存在标定图像
l=dir([calib_name'*']);%返回含calib_name的所有文件信息的一个结构数组n*1
Nl=size(l,1);%Nl为图像的幅数
Nima_valid=0;
ind_valid=[];
loc_extension=[];
length_name=size(calib_name,2);%calib_name的长度
ifNl>0,
forpp=1:
Nl,
filenamepp=l(pp).name;%第pp幅图像的名字
ifisempty(calib_name),
iii=1;
else
iii=findstr(filenamepp,calib_name);end;
loc_ext=findstr(filenamepp,format_image);
string_num=filenamepp(length_name+1:
loc_ext-2);
ifisempty(str2num(string_num)),
iii=[];
end;
if~isempty(iii),%如果iii非空
if(iii
(1)~=1),%又如果iii
(1)!
=1,则将iii置空
iii=[];
end;
end;
if~isempty(iii)&~isempty(loc_ext),
Nima_valid=Nima_valid+1;ind_valid=[ind_validpp];%第几个文件的下标是正确的
loc_extension=[loc_extensionloc_ext
(1)];
end;
end;
if(Nima_valid==0),
format_image=upper(format_image);
forpp=1:
Nl,
filenamepp=l(pp).name;
ifisempty(calib_name),
iii=1;
else
iii=findstr(filenamepp,calib_name);
end;
loc_ext=findstr(filenamepp,format_image);
string_num=filenamepp(length_name+1:
loc_ext-2);
ifisempty(str2num(string_num)),
iii=[];
end;
if~isempty(iii),
if(iii
(1)~=1),
iii=[];
end;
end;
if~isempty(iii)&~isempty(loc_ext),
Nima_valid=Nima_valid+1;
ind_valid=[ind_validpp];
loc_extension=[loc_extensionloc_ext
(1)];
end;
end;
if(Nima_valid==0),
fprintf(1,'Noimagefound.Fileformatmaybewrong.\n');
else
string_length=zeros(1,Nima_valid);indices=zeros(1,Nima_valid);
forppp=1:
Nima_valid,
name=l(ind_valid(ppp)).name;
string_num=name(length_name+1:
loc_extension(ppp)-2);
string_length(ppp)=size(string_num,2);%数字的长度
indices(ppp)=str2num(string_num);%数字的大小--下标的顺序
end;
first_num=min(indices);
n_ima=max(indices)-first_num+1;
ifmin(string_length)==max(string_length),
N_slots=min(string_length);
type_numbering=1;
else
N_slots=1;
type_numbering=0;
end;
image_numbers=first_num:
n_ima-1+first_num;
active_images=ones(1,n_ima);
end;
else
string_length=zeros(1,Nima_valid);
indices=zeros(1,Nima_valid);
forppp=1:
Nima_valid,
name=l(ind_valid(ppp)).name;
string_num=name(length_name+1:
loc_extension(ppp)-2);
string_length(ppp)=size(string_num,2);
indices(ppp)=str2num(string_num);
end;
first_num=min(indices);
n_ima=max(indices)-first_num+1;
ifmin(string_length)==max(string_length),
N_slots=min(string_length);
type_numbering=1;
else
N_slots=1;
type_numbering=0;
end;
image_numbers=first_num:
n_ima-1+first_num;
active_images=ones(1,n_ima);
end;
else
fprintf(1,'Noimagefound.Basenamemaybewrong.\n');
end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ima_read_calib.m
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%读取标定图像
if~
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 Harris 原理 像素 坐标 检测 Matlab 程序