%人脸识别 L=bwlabel(BW,8);%利用bwlabel()函数得到连通域区间 BB=regionprops(L,'BoundingBox');%得到矩形框 去框住每一个连通域 %对每个矩形框进行记录,记录其左上角点,长,宽 然后转换成矩阵形式 BB1=struct2cell(BB); BB2=cell2mat(BB1); [s1 s2]=size(BB2); mx=0; for k=3:4:s2-1 p=BB2(1,k)*BB2(1,k+1); %连通域矩形面积 %找出最大连通域面积 那块连通域就是我们寻找的人脸了 if p>mx && (BB2(1,k)/BB2(1,k+1))<1.8 mx=p; j=k; end end subplot(2, 3, 6);imshow(Img); hold on; rectangle('Position',[BB2(1,j-2),BB2(1,j-1),BB2(1,j),BB2(1,j)],'EdgeColor','r') title('标记图像', 'FontWeight', 'Bold'); 分析一下这段代码的主要功能以及每一行的功能
时间: 2024-04-26 12:22:12 浏览: 111
这段代码的主要功能是对输入的二值化图像进行人脸检测,利用bwlabel函数得到连通域区间,再利用regionprops函数得到各个连通域的矩形框,对每个矩形框进行记录,记录其左上角点、长、宽,并将这些信息转换成矩阵形式。接着,通过循环遍历每个矩形框,找出最大连通域面积,判断是否符合人脸的特征(长宽比小于1.8),如果符合则标记出人脸位置。
每一行代码的功能如下:
1. L=bwlabel(BW,8):利用bwlabel函数得到输入图像的连通域区间矩阵L,8表示8连通域。
2. BB=regionprops(L,'BoundingBox'):利用regionprops函数得到各个连通域的矩形框信息,存储在BB中。
3. BB1=struct2cell(BB):将BB结构体转换为cell数组BB1。
4. BB2=cell2mat(BB1):将BB1的cell数组转换为矩阵形式BB2。
5. [s1 s2]=size(BB2):得到矩阵BB2的行数和列数,分别赋值给s1和s2。
6. mx=0:初始化最大连通域面积mx为0。
7. for k=3:4:s2-1:循环遍历每个矩形框,步长为4,从第3列开始遍历,直到s2-1列。
8. p=BB2(1,k)*BB2(1,k+1):计算第k列和k+1列的矩形框面积,并将其赋值给p。
9. if p>mx && (BB2(1,k)/BB2(1,k+1))<1.8:判断当前矩形框面积是否大于最大连通域面积mx,并且当前矩形框长宽比是否小于1.8。
10. mx=p; j=k;:如果当前矩形框符合条件,则将当前矩形框面积赋值给最大连通域面积mx,并将当前矩形框列数k赋值给变量j。
11. subplot(2, 3, 6):将图像分成2行3列,当前为第6个子图。
12. imshow(Img):显示原始图像。
13. hold on:保持当前图像,方便在该图像上添加其他图形。
14. rectangle('Position',[BB2(1,j-2),BB2(1,j-1),BB2(1,j),BB2(1,j)],'EdgeColor','r'):在当前图像上添加一个红色矩形框,其左上角点为BB2(1,j-2)和BB2(1,j-1),长为BB2(1,j),宽为BB2(1,j)。
15. title('标记图像', 'FontWeight', 'Bold'):添加子图标题,标题为“标记图像”,字体加粗。
阅读全文