基于MatlabGUI的Harris角点检测程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于MatlabGUI的Harris角点检测程序
作 者: Bugzhao Mailto: bugzhao@ QQ:88576613 发表时间: 2005-2-17
内容概要: 我写的一个使用matlab制作的角点检测程序
图片支持格式:jpg、bmp、tif等格式的灰度、彩色图片 目前仅实现了harris检测器
最终将实现四种角点检测算法
包括经典的harris、基于canny边缘检测和弧度、
基于多分辨率、基于SUSAN
本文分三部分
第一部分简要介绍图像处理理论中的角点检测
第二部分介绍matlab GUI编程
第三部分介绍本程序的完整实现
Part(1)
角点检测(corner detection/extration)经常被用于作为特征提取的第一步。比如在制作一个全景图拼接程序中,我们可以首先检测邻接图片的角点,然后在这些角点中进行适当选择排除,最终形成两幅图片的特征点对。接下来可以根据这些特征点对来计算邻接图片的变换矩阵(一般使用仿射变换来近似投影变换),最终经图像融合技术就可以得到全景图。
角点检测大体有两种思路,一种是直接基于灰度,另一种是先检测边缘,然后计算弧度的局部极大值得到角点。后者对噪声有较好的抗干扰性能。
本课题中首先来实现harris角点检测算法
首先来看最为经典的Moravec算法。算法思路是计算图像灰度在任意方向上的变化,使用一个移动窗口,在像素点的4个方向进行移动,然后求最小E值的局部最大值。在均匀灰度中,E值在各个方向都很小;在边缘处,最小值依赖于边缘的方向,可以想像E值变化有大有小;而在角点处,每个方向的E值变化都较大。
所以检测4个方向中E值变化最小的那个量,如果它仍大于某一给定阈值,即可认为此点为角点。这就是Moravec算法的思路。
以上公式即为E值计算公式。W为窗口,I为像素。Moravec算法的思想可以直观的理解。
Harris在此算法的基础之上进行了改进,他利用泰勒级数展开方法将移动方向进行了扩展使之不再局限,同时引入了一种平滑因子,增强了抗干扰能力。
关于算法的梗概介绍到此
更加详细的介绍请参见harris的原文:
C. Harris and M. Stephens, A combined corner and edge detector, Fourth Alvey Vision Conference, pp.147-151, 1988.
Part(2)
先来看看程序界面:
利用matlab进行GUI程序设计的步骤:
1,输入guide,进入layout设计界面,进行控件排布的外观设计 2,为每个控件链接上代码
介绍GUI设计的文章很多,我这里以FAQ的形式讲述一下。
首先如何制作一个按钮?
第一步将按钮图标拖入,然后设置图标属性
调整按钮属性:
接下来,如何为按钮的响应链接一个响应函数?
就是在这个Callback里设置的
这样就进入了响应函数设计部分。怎么样,十分简单吧。
hObject这里就是这个按钮的句柄,而handles是一种和次figure相关连的结构体,用于存放传递参数。我们就可以在此书写函数语句了。比如输入:
prompt = {"Enter a number"};
dlg_title = "Input test";
num_lines= 1;
def = {"1"};
answer = inputdlg(prompt,dlg_title,num_lines,def);
val=str2num(answer{1});
disp(val)
这里顺便介绍一下inputdlg,这是一个类似于VCVB中的弹出对话框的东东,可以接收用户输入参数。上述语句可以将用户输入保存在val中,并在命令行窗口中显示结果。如下:
这里1是默认值,如果用户直接按回车则接收此作为输入
本程序还用到了popupmenu,大家可以参考第三部分的源代码。
另外还有一个重要的函数:
[FileName,PathName] = uigetfile("*.bmp","Select BMP file"); 本函数弹出一个文件选择对话框并返回文件完整路径。
GUI的介绍到此结束
Part(3)
现在来看看如何编写完整的代码
首先,设计figure文件,最终做成如下界面:
完整matlab代码如下:
function varargout = cornerdetect(varargin)
gui_Singleton = 1;
gui_State = struct("gui_Name", mfilename, ...
"gui_Singleton", gui_Singleton, ...
"gui_OpeningFcn", @cornerdetect_OpeningFcn, ...
"gui_OutputFcn", @cornerdetect_OutputFcn, ...
"gui_LayoutFcn", [] , ...
"gui_Callback", []);
if nargin & isstr(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% --- Executes just before cornerdetect is made visible.
function cornerdetect_OpeningFcn(hObject, eventdata, handles, varargin)
%set initial parameters
handles.output = hObject;
handles.type1=1;
handles.type2=1;
set(handles.button_detectcorner1,"Enable","Off");
set(handles.popupmenu_selectdetector1,"Enable","Off");
set(handles.button_detectcorner2,"Enable","Off");
set(handles.popupmenu_selectdetector2,"Enable","Off");
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes cornerdetect wait for user response (see UIRESUME)
% uiwait(handles.figure1);
function varargout = cornerdetect_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
% --------------------------------------------------------------------------------------------------------------- function button_loadimage1_Callback(hObject, eventdata, handles)
[FileName,PathName] = uigetfile("*.bmp","Select BMP file");
[handles.i1,handles.map1,handles.g1,handles.d1]=loadimage(PathName,FileName); imageshow(handles.i1,handles.map1,handles.axes1);
set(handles.popupmenu_selectdetector1,"Enable","On");
set(handles.button_detectcorner1,"Enable","On");
guidata(gcf,handles);
% --- Executes during object creation, after setting all properties.
function popupmenu_selectdetector1_CreateFcn(hObject, eventdata, handles)
if ispc
set(hObject,"BackgroundColor","white");