%this class is to realize FAST feature extractor
classdef myFAST
properties
numInChain = 12;
threshold = 0.3;
img;
featureMap;
end
methods
function obj = myFAST(img_)
if ndims(img_) == 3
obj.img = rgb2gray(img_);
else
obj.img = img_;
end
end
% FAST的实现
function [corners] = operate(obj)
corners = []; % 特征点
tempCorners = []; % 特征点的candidate
[m, n] = size(obj.img);
obj.featureMap = zeros(m, n); %特征点的打分值,如果不是特征点打分为0
for i = 4:m-4
for j = 4:n-4
% p0为检测点
p0 = obj.img(i,j);
% 依次提取当前点半径为3的Bresenham圆圆周上的点,检测点正上方为p(1)
p = [];
p(end + 1) = obj.img(i - 3 ,j ); %p1
p(end + 1) = obj.img(i - 3 ,j + 1); %p2
p(end + 1) = obj.img(i - 2 ,j + 2); %p3
p(end + 1) = obj.img(i - 1 ,j + 3); %p4
p(end + 1) = obj.img(i ,j + 3); %p5
p(end + 1) = obj.img(i + 1 ,j + 3); %p6
p(end + 1) = obj.img(i + 2 ,j + 2); %p7
p(end + 1) = obj.img(i + 3 ,j + 1); %p8
p(end + 1) = obj.img(i + 3 ,j ); %p9
p(end + 1) = obj.img(i + 3 ,j - 1); %p10
p(end + 1) = obj.img(i + 2 ,j - 2); %p11
p(end + 1) = obj.img(i + 1 ,j - 3); %p12
p(end + 1) = obj.img(i ,j - 3); %p13
p(end + 1) = obj.img(i - 1 ,j - 3); %p14
p(end + 1) = obj.img(i - 2 ,j - 2); %p15
p(end + 1) = obj.img(i - 3 ,j - 1); %p16
thr = obj.threshold*p0;
%判断该点是否为特征点的candidate
%featureFlag = 1 代表周围有n个以上的点大于p0 + thr
%featureFlag = 2 代表周围有n个以上的点小于p0 - thr
featureFlag = FastFeaturePointDetect(p0,p,thr,obj.numInChain);
if featureFlag == 1 || featureFlag == 2
%如果是特征点,计算特征点的打分值
val = ExtremeSuppression(p0,p,thr, obj.numInChain,featureFlag);
tempCorners(end + 1).x = j;
tempCorners(end).y = i;
tempCorners(end).val = val;
obj.featureMap(i,j) = val;
end
end
end
%极值点抑制
for k = 1:length(tempCorners)
j = tempCorners(k).x;
i = tempCorners(k).y;
tempList(1) = obj.featureMap(i - 1,j - 1);
tempList(2) = obj.featureMap(i - 1,j );
tempList(3) = obj.featureMap(i - 1,j + 1);
tempList(4) = obj.featureMap(i ,j - 1);
tempList(5) = obj.featureMap(i ,j + 1);
tempList(6) = obj.featureMap(i - 1,j - 1);
tempList(7) = obj.featureMap(i - 1,j );
tempList(8) = obj.featureMap(i - 1,j + 1);
%如果特征点的打分值是附近3*3区域里最大的则将tempCorners(k)付给corners
if tempCorners(k).val > max(tempList)
corners(end+1).x = tempCorners(k).x;
corners(end).y = tempCorners(k).y;
corners(end).val = tempCorners(k).val;
end
end
end
end
end
%判断该点是否为特征点的candidate
function flag = FastFeaturePointDetect(p0,p,thr, numInChain)
flag = 0;
% 遍历16个点,看是否有numInChain个点大于p0 + thr
% 循环列表的index = mod(k-1,length(p))+1
for i = 1:16
if p(i) - p0 > thr
counter = 1;
for j = 1:numInChain - 1
k = i + j;
if p(mod(k-1,length(p))+1) - p0 > thr
counter = counter + 1;
else
break;
end
end
if counter == numInChain
flag = 1;
return
end
else
continue;
end
end
% 遍历16个点,看是否有numInChain个点小于p0 - thr
for i = 1:16
if p0 - p(i) > thr
counter = 1;
for j = 1:numInChain - 1
k = i + j;
if p0 - p(mod(k-1,length(p))+1) > thr
counter = counter + 1;
else
break;
end
end
if counter == numInChain
flag = 2;
return
end
else
continue;
end
end
end
%给特征点打分
function [val] = ExtremeSuppression(p0, p,thr, numInChain,featureFlag)
N = length(p);
if featureFlag == 1
d = p - double(p0);
else
d = double(p0) - p;
end
a0 = thr;
%打分的结果一定是d(1)到d(16)中的一个,遍历16次找出最大的满足条件的d(k)
for i = 1:16
a = min([d(mod(i,N)+1),d(mod(i+1,N)+1),d(mod(i+2,N)+1)]);
if a < a0
continue;
end
for j = 4:numInChain-1
a = min(a,d(mod(i+j-1,N)+1));
end
a0 = max(a0,min(a, d(mod(i-1,N)+1) ));
a0 = max(a0, min(a, d(mod(i-1,N)+1) ));
end
val = a0 -1;
end
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
myFAST.rar (36个子文件)
FAST
myFAST.m 5KB
img.png 1.25MB
matlabFast.m 204B
testMyFAST.m 175B
.git
logs
HEAD 154B
refs
heads
master 154B
remotes
origin
master 136B
info
exclude 240B
index 590B
COMMIT_EDITMSG 15B
GITGUI_MSG 16B
objects
pack
info
e6
9de29bb2d1d6434b8b29ae775ad8c2e48c5391 15B
da
892f778e665496085b4cc431586a809a744a33 117B
9a
73412e99e40b53885f47583ef60ddb9244ee98 1KB
99
5b294205e861981c46296860e307f42686d75c 57B
e0
96479ddee67fc39fdcbe3e084f690123d76aa5 596B
2d
ad3d6c3812619ff95eef6ab76ab0f4fa8ccfe2 202KB
d4
d41c1e31466134f439feeb0dad5ddd8fa16ff4 167B
19
43ed18930df403a5c8af6ec51abea541b5e709 1.25MB
a0
ff0636fa7482121b889c9b2a670a82f1ef9722 1KB
7b
f4fc5530bbe1c5c0c931b6dc9dbb0059109e7e 162B
HEAD 23B
config 387B
refs
heads
master 41B
tags
remotes
origin
master 41B
hooks
pre-applypatch.sample 424B
pre-push.sample 1KB
commit-msg.sample 896B
pre-commit.sample 2KB
applypatch-msg.sample 478B
prepare-commit-msg.sample 1KB
update.sample 4KB
post-update.sample 189B
pre-rebase.sample 5KB
pre-receive.sample 544B
description 73B
共 36 条
- 1
资源评论
- yanmengying2022-03-12下载好就FAST下4个文件,有matlab自带函数,还有博主自己写的,可以运行,讲的原理也很清晰,在https://blog.csdn.net/qq_35721810/article/details/85158020?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164706393016780357226405%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164706393016780357226405&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-85158020.pc_search_result_cache&utm_term=FAST%E7%AE%97%E6%B3%95matlab%E5%AE%9E%E7%8E%B0&spm=1018.2226.3001.4187这里博主有讲原理及代码的解释
chivalry00L
- 粉丝: 13
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功