一、課題背景
人體行為檢測與識别是目前研究的重點,具有很高的研究價值和廣闊的應用前景。主要應用在型人機互動、運動分析、智能監控和虛拟現實也稱靈境技術(VR)領域,對于研究人體檢測和識别有着重要的意義。因為人的運動的複雜性和對外部環境的多變性,使得人們行為識别和檢測具有一些挑戰。對人類行為和檢測的研究目前處于初級階段,有待進一步研究和開發。
本文基于matlab人體行為識别和檢測的研究,本文主要研究的是從圖像中判斷出目标處于何種行為,例如常見的走、坐、躺、跑、跳等行為的識别。從現有的很多主流研究成果來看,最常見的行為識别系統結構包括幾個子產品:目标檢測、目标跟蹤、行為識别。本文首先對圖像進行判斷是否有人體目标,識别出人體後對圖像進行灰階化,在對灰階圖像用背景差法與背景圖像比對,最後,比對提取出的人體來判斷人體處于何種行為。
二、 研究意義
人體行為檢測與識别技術除了在智能監控系統中具有有廣泛的應用前景和潛力,在計算機視覺中是一個極具有吸引力及挑戰性的問題。人體運動的視覺分析是一個新興前沿的研究領域,涉及模式識别,圖像處理,計算機視覺,人工智能等多門學科。它可以廣泛應用于許多領域,如:運動捕捉,人機互動,監控和安全,環境控制和監測,體育及娛樂分析等,特别是在視訊監控方面可廣泛應用于銀行、郵電、教育、交通、公安、監獄、法庭、大型公共設施、公共場所(銀行、醫院、停車場、商店、等公共場所甚至家庭庭院内)、大型倉庫及軍事基地等場所,在國防與公共安全領域起着日益重要的作用。綜上所述,是以,人體動作的視覺分析具有極大的商業價值與現實意義。
三、 研究内容
本文主要對人體行為檢測和識别方法進行研究,主要研究内容如下:
(1)判斷是否為人體
在目标提取之前,首先要對輸入的圖檔進行檢測。本文通過膚色檢測判斷目标是否為人體。
(2)人體目标提取
如果是人體導入背景圖檔與背景圖檔做差,再通過背景差門檻值分割法進行提取。
(4)行為識别
在解決了以上的問題之後,接下來就是要選擇一種合适的算法來進行人體姿态識别,這也是本文研究的重點和難點。本文采用一種人體目标的連通區域的長寬比例來對人體行為進行識别。
四、實作示例圖2-2(1)卧姿的人臉定位
圖2-2(2)跳躍的人臉定位
圖2-2(3)行走時的人臉定位
圖2-2(4
)坐姿的人臉定位
圖2-2(5)
奔跑時的人臉定位
附錄1 部分關鍵源碼及解釋
在這部分,将結合具體的源代碼具體說明系統的執行流程和邏輯。
%申明資料庫的位置
input = 'dataset';
%申明前景檢測輸出圖像的位置
output = 'forground';
output2 = 'result';
str1 = dir(input); %存儲每個動作的檔案夾
bk = imread('bk.png');%讀入背景圖檔
bk = rgb2gray(bk);
% 彩色背景轉灰階背景
threshold = 40; %背景差門檻值
radio_jump = [];
radio_lie = [];
radio_run = [];
radio_sit = [];
radio_walk = [];
for x = 3:length(str1) %循環每個動作檔案夾
x
str2 = dir([input '\' str1(x).name '\*.png']); %存儲每個動作檔案中的圖檔資訊
mkdir_fun(output, str1(x).name); % 在前景輸出檔案夾中,為每個動作建立檔案夾
mkdir_fun(output2, str1(x).name);
%[x y x_with y_with]
%計算外接框的長寬比
radio = bb(max_index).BoundingBox(3)/bb(max_index).BoundingBox(4);
if x == 3
radio_jump = [radio_jump;radio];
end
if x == 4
radio_lie = [radio_lie;radio];
end
if x == 5
radio_run = [radio_run;radio];
end
if x == 6
radio_sit = [radio_sit;radio];
end
if x == 7
radio_walk = [radio_walk;radio];
end
imshow(im)
% 判斷外接框内是否有膚色, 如果有膚色, 才是人, 才進入行為判斷
c = floor(bb(max_index).BoundingBox(1)) ; %x
r = floor(bb(max_index).BoundingBox(2)); %y
c_width = bb(max_index).BoundingBox(3); %x_with
r_width = bb(max_index).BoundingBox(4); % y_with
rectangle('Position', [c r c_width r_width])
sum_im = im(r:r+r_width,c:c+c_width,:); %外接框圖像
skin = skin_fun(sum_im); %尋找是否有膚色
skin = medfilt2(skin);
bb_skin = regionprops(skin,'BoundingBox'); %如果有膚色,切割出連通域
min_index = 1;
min_height = 720;
if size(bb_skin,1) >=1 %如果找到膚色
rectangle('Position', [c r c_width r_width])
rectangle('Position', [c2 r2 c_width2 r_width2])
text(c2+c_width2+5,r+r_width2+5,'face') ;
%jump
if radio<= 0.5
text(c-5,r-5,'jump') ;
end
%lie
if radio>= 1
text(c-5,r-5,'lie') ;
end
%run
if radio >0.54 && radio<0.6
text(c-5,r-5,'run') ;
end
%sit
if radio >=0.6 && radio <1
text(c-5,r-5,'sit') ;
end
%walk
else %如果沒找到膚色
text(c-5,r-5,'No Human') ;
end
saveas(gcf,[output2 '\' str1(x).name '\' str2(y).name]);
pause(0.005)
imwrite(fg,[output '\' str1(x).name '\' str2(y).name]);
end
end
plot(radio_jump,'b');
hold on;
plot(radio_lie,'g');
hold on;
plot(radio_run,'k');
hold on;
plot(radio_sit,'y');
hold on;
plot(radio_walk,'r');