简单人脸识别定位

clear all;
close all;
clc;
I=imread('ren.jpg');%%被识别图片存储路径
%%%%%%%%%%%%%%%%%算法封装,可以看作一个黑盒子%%%%%%%%%%%%%%%%
O=rgb2ntsc(I);%%把rbg图像转为ntsc色域
% figure;
% subplot(131);imshow(O(:,:,1));
% subplot(132);imshow(O(:,:,2));
% subplot(133);imshow(O(:,:,3));
G=O(:,:,2);%通过观察发现人脸部分的像素集中在第二个维度,因此取第二个维度的数据进行人脸识别
% figure;imshow(G,[]);
[m,n]=size(G);%求出数据的大小,m代表行数,n代表列数
threh_low=0.09;
threh_high=0.12;%根据人脸部分的像素大小选择阈值,这里的两个阈值可以根据需要设定
U=zeros(m,n);%预分配数组,利用设定的阈值对图像进行二值化
for i=1:1:m
   for j=1:1:n
     if G(i,j)>=threh_low&&G(i,j)<=threh_high
        U(i,j)=1;
     end
   end
end
% figure;imshow(U,[]);
% G_U=U.*G;
% figure;imshow(G_U);

U_c=bwmorph(U,'erode');%%利用腐蚀操作删除分叉线条,保留像素聚集的区域
% figure;imshow(U_c,[]);

%%%观察图像可以发现,人脸的像素在跟周围的环境有明显的区别,因此下面利用连通区域的知识计算图像中的连通区域
%%%如果连通区域的大小符合人脸的特征,也就是长宽比符合人脸的比列,则认为此区域为人脸
L=bwlabel(U_c);%标记连通区域
% figure;imshow(L,[]);
B=regionprops(L,'all');%计算连通区域的性质
Se=[B.Area];%取每个连通区域的面积参数
num=length(Se);%求有多少个连通区域
%%%下面计算每个连通区域的特征,看看是否是人脸,从面积最大的连通区域开始,如果找到就停止循环。
h_w_low=0.5;
h_w_high=3;
for j=1:1:num
    Sm=max(Se);%找出面积的最大值
    B1=bwareaopen(U_c,Sm);%去除图像中小于当前连通区域面积的区域
%     figure;imshow(B1);
    sum_col=sum(B1,1);%对列求和
    sum_row=sum(B1,2);%对行求和
    %找到该连通区域的左边的坐标
    for i=1:1:n
        if(sum_col(1,i)~=0)
            col_left=i;
            break;
        end
    end
    %找到该连通区域的右边的坐标
    for i=n:-1:1
        if(sum_col(1,i)~=0)
            col_right=i;
            break;
        end
    end
    %找到该连通区域的上边的坐标
    for i=1:1:m
        if(sum_row(i,1)~=0)
            row_up=i;
            break;
        end
    end
     %找到该连通区域的下边的坐标
    for i=m:-1:1
        if(sum_row(i,1)~=0)
            row_down=i;
            break;
        end
    end
    w=abs(col_right-col_left);%求矩形区域的长度
    h=abs(row_down-row_up);%求举行区域的高度
    
    if h>h_w_low*w&&h_w_high<3*w%h/w在一定范围内就确定是人脸
%         I1=imcrop(B1,[col_left row_up  w h]);%裁剪脸部区域
%         [n1, m1]=size(I1);
%         figure;imshow(I1);
%在原图上用矩形框框出面部区域。
        figure;
        imshow(I);
        hold on;
        h1=line([col_left col_right],[row_up,row_up],'Color',[1 0 0],'LineWidth',3);
        h2=line([col_left col_right],[row_down,row_down],'Color',[1 0 0],'LineWidth',3);
        h3=line([col_left col_left],[row_up,row_down],'Color',[1 0 0],'LineWidth',3);
        h4=line([col_right col_right],[row_up,row_down],'Color',[1 0 0],'LineWidth',3);
        break;
    end
end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV(Open Source Computer Vision Library)是一个广泛使用的计算机视觉库,用于处理图像和视频数据。在OpenCV中实现人脸识别可以通过以下步骤进行: 1. **人脸检测**:首先,你需要使用OpenCV中的`cv2.CascadeClassifier`,它内置了一些预训练的人脸检测器,如Haar级联分类器或HOG(Histogram of Oriented Gradients)分类器。这些分类器可以帮助定位图像中的人脸。 ```python face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') faces = face_cascade.detectMultiScale(image, scaleFactor=1.1, minNeighbors=5) ``` 2. **人脸对齐**:为了提高识别精度,通常会对检测到的人脸进行一些预处理,如归一化和面部关键点定位。 3. **特征提取**:使用OpenCV人脸识别模块,如`cv2.face`或者深度学习方法(如FaceNet、Dlib等),从每个检测到的区域提取特征向量。这些特征向量描述了人脸的独特性。 ```python from sklearn import datasets import face_recognition # 使用face_recognition库 image = face_recognition.load_image_file('path_to_image.jpg') face_encoding = face_recognition.face_encodings(image) ``` 4. **匹配和识别**:将提取的特征与已知的人脸数据库进行比较,通常使用余弦相似度或欧氏距离来计算匹配度。如果找到匹配度超过阈值的,就可以认为是已知的人脸。 ```python known_faces = [] # 储存已知人脸的特征向量 known_face_names = [] # 储存对应的名字 if len(known_faces) > 0: results = face_recognition.compare_faces([known_faces], face_encoding) name = "Unknown" if not results else known_face_names[results.index(True)] print(f"Detected face is: {name}") else: print("No known faces in the database.") ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值