人口密度檢測

2020-10-04 16:00:09

·低密度人群程式碼說明中文檔案及補充說明

·程式碼列表

·程式碼使用說明

     這套程式碼的使用只針對低密度的人群密度,即人群密度的統計的滿足能夠分辨單個的人,即視訊中不存在多個人疊加的情況。

     程式碼MATLAB2007b,執行即開始執行本程式碼。

·設計方案說明

第一步:讀取圖片視屏序列

function [n_frames,I3] = func_readvedio(folder,list);

n_frames = 0;

for i=1:length(list)

    I  = imread(fullfile(folder,list(i).name));

    I2 = rgb2gray(uint8(I));

    I3(:,:,i) = I2;

    n_frames  = n_frames + 1;

end

這樣寫可以專門用來讀取連續編號的圖片序列作為視屏。

第二步:提取背景

    這個部分的方法參考您提供的論文的這個部分:

對應的程式碼如下所示:

function back3 = func_getbackground(image,frames,T);

rows = size(image,1);   

cols = size(image,2);   

d(1:rows,1:cols,1)          = image(1:rows,1:cols,1);

for k = 2:frames

    d(1:rows,1:cols,k)      = image(1:rows,1:cols,k) - image(1:rows,1:cols,k-1);

end

//以上就是求解影象的差分

CDM(1:rows,1:cols,2:frames) = d(1:rows,1:cols,2:frames);

CDM(abs(CDM) <  T)=0;

CDM(abs(CDM) >= T)=255;

//CDM

m=0;

for i=1:rows

   for j=1:cols

        for k=2:frames

             if CDM(i,j,k) == 0

             m(k)=1;

             end

             if CDM(i,j,k) == 255

             m(k)=rand(1);

             end         

        end

             position(i,j) = func_position(m);

    end

end

//求解CDM中最大的連0的座標

for i=1:rows

    for j=1:cols

    back3(i,j) =image(i,j,position(i,j));   

    end

end

//獲得背景

 

第三步:當前圖片與背景的差

function images2 = func_subbackground(image,back,frames,T2);

rows = size(image,1);   

cols = size(image,2);

for k=1:frames

    images(1:rows,1:cols,k)  = back(1:rows,1:cols)-image(1:rows,1:cols,k);  

    images2(1:rows,1:cols,k) = im2bw(images(1:rows,1:cols,k),T2); 

end

這裡求解差,並將得到的結果求二值圖

 

第四步:形態學處理

rows = size(image,1);   

cols = size(image,2);

for k=1:frames

     images3(1:rows,1:cols,k)=bwareaopen(image(1:rows,1:cols,k),10);

end

這裡我們主要將視屏中的個別噪點去掉使畫面更加’乾淨’;

第五步:邊緣檢測

function images = func_edgecheck(image,frames);

rows = size(image,1);   

cols = size(image,2);

for k = 1:frames

    for i=2:rows

       for j=2:cols

         if image(i,j,k)==1 &&(image(i+1,j,k)==0||image(i-1,j,k)==0||image(i,j+1,k)==0||image(i,j-1,k)==0)

         images(i,j,k)=255;

         else

         images(i,j,k)=0;

         end

       end

    end

end

普通邊間求解法

第六步:求解前景畫素數

function Num = func_pixel(image,frames);

rows = size(image,1);   

cols = size(image,2);

Num(1:frames)  = 0;

for k = 1:frames

    for i=2:rows

       for j=2:cols

              if image(i,j,k)>0

              Num(k) = Num(k)+1;

              end

       end

    end

end

plot(Num,'r-*');

grid;

ylabel('ÏñËØÊý');

xlabel('Ö¡ÊýÄ¿');

title('µÍÃܶÈÈË¿ÚÃܶÈ');

第七步:擬合說明

     這個步驟主要是通過求的的畫素值與實際存在的人數進行擬合。其擬合效果如下所示:

 

通過擬合得到人數和畫素數的關係曲線為:

即在低密度的條件下,畫素數和人數的關係曲線。

 

 

·高密度人群程式碼說明中文檔案

裡面的程式碼的說明如下所示:

Test:測試視屏中提取的視屏特徵引數儲存的資料夾;

Train1:高密度訓練視屏中提取的視屏特徵引數儲存的資料夾;

Train2:中密度訓練視屏中提取的視屏特徵引數儲存的資料夾;

Vedio:儲存視屏的檔案;

 

 

 

 

 

 

 

 

 

 

 

 

 

分類函數

灰度共生矩陣的相關性引數

求背景

求灰度共生矩陣函數

灰度共生矩陣子函數

載入資料

畫圖函數

計算CDM最長0點位置函數

讀取視屏函數

背景相減函數

形態學處理還輸

SVM分類核函數

系統執行主函數

SVM分類畫圖

SVM子函數

測試檔案,無用。。

 

 

系統包括如下幾個部分:

 

 

 

 

 

 

其中前面三個部分均為特徵提取函數。這裡以高密度特徵提取為例子:

前面的四個步驟都是相同的。

然後是步驟五。灰度共生矩陣特徵引數的提取。

其步驟為:

其主函數為:

 

其中的主要函數為

 

這裡主要利用到了MATLAB的內建函數graycomatrix進行求解灰度共生矩陣;

然後利用函數graycoprops求其每個角度的特徵引數

然後通過如下的程式碼求的0,45,90,135四個角度的共生矩陣的各個特徵引數;

 

 

 

 

 

這個程式碼段就是將灰度共生矩陣引數儲存到相應的檔案中。

 

然後後幾個視屏的灰度共生矩陣的特徵引數的提取也是同樣的步驟進行。

 

注意,在計算特徵引數的時候,有四種情況,就是分別計算了灰度等級為8,16,32,64四種情況下的特徵引數。

 

這裡首先選擇灰度等級,8,16,32,64等等。

然後進行資料載入。

然後這裡的high_low就是進行識別測試資料是高密度還是中密度的選中函數。

最後兩個就是通過0度和90度的特徵引數進行分類。

 

測試步驟:

假設不知道測試的視訊的人口密度情況;

然後首先輸入high_low = 1;

然後執行程式碼:

得到如下的執行結果:

這個說明輸入的測試視訊和低密度的特徵引數是一類的。則說明測試引數是低密度視訊

 

 

 

 

加入認為輸入的視訊是高密度。那麼high_low = -1;然後執行程式碼;

這是錯誤的。這說明輸入的不是高密度,是低密度。

通過這樣對比,完成一組視訊的測試,判斷輸入的視訊是中密度還是高密度。