原文
本文提出了一種基於膚色資訊和眼睛粗略定位的人臉檢測演算法。該演算法先對 anil k.jain 的 cb 、 cr 橢圓聚類方法進行了改進,用改進的演算法進行膚色提取,經過膚色區域的分析,對人臉區域進行預檢測,確定人臉可能區域,然後再根據眼睛的粗略定位進一步確定人臉區域。
一、膚色分析(skin.m)
anil k.jain提出的基於ycbcr顏色空間的膚色模型,根據當前點的cb cr值判斷是否為膚色。
% anil k.jain提出的基於ycbcr顏色空間的膚色模型% 根據當前點的cb cr值判斷是否為膚色
function result = skin(y,cb,cr)
% 引數
a = 25.39;
b = 14.03;
ecx = 1.60;
ecy = 2.41;
sita = 2.53;
cx = 109.38;
cy = 152.02;
xishu = [cos(sita) sin(sita);-sin(sita) cos(sita)];
% 如果亮度大於230,則將長短軸同時擴大為原來的1.1倍
if(y > 230)
a = 1.1*a;
b = 1.1*b;
end% 根據公式進行計算
cb = double(cb);
cr = double(cr);
t = [(cb-cx);(cr-cy)];
temp = xishu*t;
value = (temp(1) - ecx)^2/a^2 + (temp(2) - ecy)^2/b^2;
% 大於1則不是膚色,返回0;否則為膚色,返回1
if value > 1
result = 0;
else
result = 1;
end
二、眼睛粗略定位(findeye.m)
% 判斷二值影象中是否含有可能是眼睛的塊% bimage----二值影象
% x---------矩形左上角頂點x座標
% y---------矩形左上角頂點y座標
% w---------矩形寬度
% h---------矩形長度
% 如果有則返回值eye等於1,否則為0
function eye = findeye(bimage,x,y,w,h)
% 根據矩形相關屬性得到二值影象中矩形區域中的資料
% 存放矩形區域二值影象資訊
part = zeros(h,w);
% 二值化
for i = y:(y+h)
for j = x:(x+w)
if bimage(i,j) == 0
part(i-y+1,j-x+1) = 255;
else
part(i-y+1,j-x+1) = 0;
endend
end[l,num] = bwlabel(part,8);
% 如果區域中有兩個以上的矩形則認為有眼睛
if num < 2
eye = 0;
else
eye = 1;
end
三、人臉檢測(facedetection.m)
function facedetection(img_name)% 讀取rgb影象
i = imread(img_name);
% 轉換為灰度影象
gray = rgb2gray(i);
% 將影象轉化為ycbcr顏色空間
ycbcr = rgb2ycbcr(i);
% 獲得影象寬度和高度
heigth = size(gray,1);
width = size(gray,2);
% 根據膚色模型將影象二值化
for i = 1:heigth
for j = 1:width
y = ycbcr(i,j,1);
cb = ycbcr(i,j,2);
cr = ycbcr(i,j,3);
if(y < 80)
gray(i,j) = 0;
else
if(skin(y,cb,cr) == 1)
gray(i,j) = 255;
else
gray(i,j) = 0;
endend
endend% 二值影象形態學處理
se=strel('arbitrary',eye(5));
%gray = bwmorph(gray,'erode');
% imopen先腐蝕再膨脹
gray = imopen(gray,se);
% imclose先膨脹再腐蝕
%gray = imclose(gray,se);
imshow(gray);
% 取出中所有包含白色區域的最小矩形
[l,num] = bwlabel(gray,8);
stats = regionprops(l,'boundingbox');
% 存放經過篩選以後得到的所有矩形塊
n = 1;
result = zeros(n,4);
figure,imshow(i);
hold on;
for i = 1:num
box = stats(i).boundingbox;
x = box(1); %矩形座標x
y = box(2); %矩形座標y
w = box(3); %矩形寬度w
h = box(4); %矩形高度h
% 寬度和高度的比例
ratio = h/w;
ux = uint8(x);
uy = uint8(y);
if ux > 1
ux = ux - 1;
endif uy > 1
uy = uy - 1;
end% 可能是人臉區域的矩形應滿足以下條件:
% 1、高度和寬度必須都大於20,且矩形面積大於400
% 2、高度和寬度比率應該在範圍(0.6,2)內
% 3、函式findeye返回值為1
if w < 20 || h < 20 || w*h < 400
continue
elseif ratio < 2 && ratio > 0.6 && findeye(gray,ux,uy,w,h) == 1
% 記錄可能為人臉的矩形區域
result(n,:) = [ux uy w h];
n = n+1;
endend% 對可能是人臉的區域進行標記
if size(result,1) == 1 && result(1,1) > 0
rectangle('position',[result(1,1),result(1,2),result(1,3),result(1,4)],'edgecolor','r');
else
% 如果滿足條件的矩形區域大於1則再根據其他資訊進行篩選
for m = 1:size(result,1)
m1 = result(m,1);
m2 = result(m,2);
m3 = result(m,3);
m4 = result(m,4);
% 標記最終的人臉區域
if m1 + m3 < width && m2 + m4 < heigth
rectangle('position',[m1,m2,m3,m4],'edgecolor','r');
endend
end
四、主函式(main.m)
%清理視窗close all
clear all
clc% 輸入影象名字
img_name = input('請輸入影象名字(影象必須為rgb影象,輸入0結束):','s');
% 當輸入0時結束
while ~strcmp(img_name,'0')
% 進行人臉識別
facedetection(img_name);
img_name = input('請輸入影象名字(影象必須為rgb影象,輸入0結束):','s');
end
over!
基於opencv級聯分類器對臉和眼睛進行檢測
基於c opencv的人臉檢測 1 建立分類器物件 cascadeclassifier face cascade,eyes cascade 2 載入資料的路徑 載入本地opencv資料夾自帶的xml檔案 string face cascade name d opencv opencv sources...
基於互嚮導的半監督面板檢測
基於資料驅動的半監督 檢測方法,用於實現人體影象的魯棒 檢測。先前的方法是嘗試在不同的色彩空間建模 顏色,並且訓練 分類器。但是這個方法依賴 顏色的分布,而且沒有語義資訊,所以效能不佳。改進辦法,通過身體檢測為嚮導來提公升 檢測的效能,如果乙個身體掩模mask可用,那麼對於 檢測有兩個好處 好處一 ...
基於邊緣檢測的車牌定位
剛開始接觸影象處理做的試驗專案,想法比較簡單,限制多弊端較大,對質量要求比較高,如果灰度變化太大又或者預處理後得到的二值影象的連通區域出現與車牌所處區域面積相近,效果就差了很多。影象的預處理是通過增加對比度以及形態學處理得到的。想要得到理想效果需要多次重複操作。有很多不足之處,還請各位大神指教。直接...