function [img, faces_num] = DetectFace(img, face_feature, L, similarity_threshold, area_threshold, row_width, col_width, step, least_face_area)
x_less = [];
y_large = [];
i = row_width;
while i <= size(img, 1)
j = col_width;
while j <= size(img, 2)
feat_temp = get_face_feat(img(i - row_width + 1: i, j - col_width + 1: j, :), L);
dist = 1 - sum(sqrt(feat_temp .* face_feature));
if dist < similarity_threshold
x_less = [x_less, i - row_width + 1];
y_large = [y_large, j];
end
j = j + step;
end
i = i + step;
end
x_large = x_less + (row_width - 1);
y_less = y_large - (col_width - 1);
% combine blocks
for i = 1: 1: length(x_less)
if x_less(i) ~= -1
for j = i + 1: 1: length(x_less)
if j ~= i && x_less(j) ~= -1
if x_less(i) == x_less(j)
if y_less(j) <= y_large(i) + col_width && y_less(j) >= y_less(i)
y_large(i) = y_large(j);
x_large(i) = max(x_large(i), x_large(j));
x_less(j) = -1;
end
end
if y_less(i) == y_less(j)
if x_less(j) <= x_large(i) + row_width && x_less(j) >= x_less(i)
x_large(i) = x_large(j);
y_large(i) = max(y_large(i), y_large(j));
x_less(j) = -1;
end
end
end
end
end
end
% remove overlap blocks
face_idx_1 = x_less ~= -1;
x_less = x_less(face_idx_1);
x_large = x_large(face_idx_1);
y_less = y_less(face_idx_1);
y_large = y_large(face_idx_1);
for i = 1: 1: length(x_less)
if x_less(i) ~= -1
area_i = (x_large(i) - x_less(i)) * (y_large(i) - y_less(i));
for j = 1: 1: length(x_less)
if j ~= i && x_less(j) ~= -1
if x_less(j) <= x_large(i) && x_less(j) >= x_less(i) && y_less(j) <= y_large(i) && y_less(j) >= y_less(i)
area_overlap = (min(x_large(i), x_large(j)) - x_less(j)) * (min(y_large(i), y_large(j)) - y_less(j));
if area_overlap / area_i >= area_threshold
x_less(j) = -1;
end
elseif x_less(j) >= x_less(i) && x_less(j) <= x_large(i) && y_less(i) <= y_less(j) && y_large(i) >= y_large(j)
area_overlap = (min(x_large(i), x_large(j)) - x_less(j)) * (y_large(j) - y_less(j));
if area_overlap / area_i >= area_threshold
x_less(j) = -1;
end
elseif y_less(j) >= y_less(i) && y_less(j) <= y_large(i) && x_less(i) <= x_less(j) && x_large(i) >= x_large(j)
area_overlap = (min(y_large(i), y_large(j)) - y_less(j)) * (x_large(j) - x_less(j));
if area_overlap / area_i >= area_threshold
x_less(j) = -1;
end
elseif x_large(j) >= x_less(i) && x_large(j) <= x_large(i) && y_less(i) <= y_less(j) && y_large(i) >= y_large(j)
area_overlap = (x_large(j) - max(x_less(i), x_less(j))) * (y_large(j) - y_less(j));
if area_overlap / area_i >= area_threshold
x_less(j) = -1;
end
elseif y_large(j) >= y_less(i) && y_large(j) <= y_large(i) && x_less(i) <= x_less(j) && x_large(i) >= x_large(j)
area_overlap = (y_large(j) - max(y_less(i), y_less(j))) * (x_large(j) - x_less(j));
if area_overlap / area_i >= area_threshold
x_less(j) = -1;
end
elseif x_less(j) >= x_less(i) && x_large(j) <= x_large(i) && y_less(i) >= y_less(j) && y_large(i) <= y_large(j)
area_overlap = (x_large(j) - x_less(j)) * (y_large(i) - y_less(i));
if area_overlap / area_i >= area_threshold
x_less(j) = -1;
end
end
end
end
end
end
% remove small blocks
for i = 1: 1: length(x_less)
if x_less(i) ~= -1
if (x_large(i) - x_less(i)) * (y_large(i) - y_less(i)) <= least_face_area
x_less(i) = -1;
end
end
end
% optimize rectangle blocks
for i = 1: 1: length(x_less)
if x_less(i) ~= -1
delta_x = x_large(i) - x_less(i);
delta_y = y_large(i) - y_less(i);
if delta_x - delta_y > delta_x / 2
delta = floor((delta_x - delta_y) / 8);
x_less(i) = x_less(i) + delta;
x_large(i) = x_large(i) - 3 * delta;
y_less(i) = max(y_less(i) - 2 * delta, 1);
y_large(i) = min(y_large(i) + 2 * delta, size(img, 2));
elseif delta_y - delta_x > delta_y / 2
delta = floor((delta_y - delta_x) / 4);
y_less(i) = y_less(i) + 2 * delta;
y_large(i) = y_large(i) - 2 * delta;
x_less(i) = max(x_less(i) - 2 * delta, 1);
x_large(i) = min(x_large(i) + 2 * delta, size(img, 1));
end
end
end
faces_num = sum(x_less ~= -1);
rect_face = logical(zeros(size(img)));
edge = 1;
for i = 1 : 1 : length(x_less)
if x_less(i) ~= -1
rect_face(max(x_less(i) - edge, 1): x_less(i) + edge, y_less(i) : y_large(i), 1) = true;
rect_face(x_large(i) - edge: min(size(img, 1), x_large(i) + edge), y_less(i) : y_large(i), 1) = true;
rect_face(x_less(i): x_large(i), max(1, y_less(i) - edge): y_less(i) + edge, 1) = true;
rect_face(x_less(i): x_large(i), y_large(i) - edge: min(size(img, 2), y_large(i) + edge), 1) = true;
end
end
img(rect_face) = uint8(255);
end
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
## 一、实验目的 1. 了解计算机储存和处理图像的基础知识 2. 理解 JPEG 标准的基本原理,变换域编码和量化的基本思想,掌握 MATLAB 处理矩阵和图像的常用命令 3. 理解变换域信息隐藏的基本方法 4. 掌握基于肤色的人脸检测算法 ## 二、实验平台 我的所有代码均在 MATLAB R2020b 版本上成功运行 ## 三、实验内容 ### 3.1 图像基础知识 #### (1)在图像中画圆 首先确定圆的圆心,为测试图像的中心;然后确定圆的半径,为图像长、宽中的较小值。接下来根据圆的定义画圆:所有与圆心的距离等于半径的点构成一个圆。在这里,为了让画出的圆清晰可见,将所有与圆心距离在 0.98~1.02 倍半径之间的点全部标红,呈现在图像上。取出标红点的关键代码如下: #### (2)将测试图像涂成国际象棋状的“黑白格” 将测试图像分成 8*8 的区域,然后对每块区域根据国际象棋“黑白格”的规则染色。在黑色的地方,将原图对应区域置为0;白色的地方则保持不变。结果如下 ### 3.2 图像压缩编码 #### (1)在变换域预处理 图像的预处理是将每个像素灰度值
资源推荐
资源详情
资源评论




















收起资源包目录







































































































共 96 条
- 1
资源评论


振华OPPO
- 粉丝: 46w+
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- NanUI-JavaScript资源
- 论信息技术对当前信息化作战的影响.docx
- 基于大数据的电梯故障预测新模式.docx
- 《计算机网络基础》习题.doc
- 园林施工项目管理的基本方法及管理过程.doc
- streamsql-SQL资源
- CAXA制造工程师-CAD-CAM-教学导案.doc
- 对大地构造相图空间数据库建设技术探讨.docx
- uniapp-yolo-detect-毕业设计资源
- stm32diansai-电赛资源
- PLC全自动洗衣机毕业设计方案.doc
- 全国计算机等级测验一级B必过练习之Word操作题练习.doc
- T68-镗床的PLC-改造设计论文正文.doc
- 基于Kinect的智能家居体感控制系统的研究与设计.docx
- 2023年互联网信息技术服务项目评估分析报告.docx
- 媒体行业移动互联网解决方案.ppt
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
