Matlab實現人眼精準識別和定位

detector=vision.CascadeObjectDetector('LeftEyeCART');

利用matlab中的vision包來檢測人眼

 

是不是定位的很準,下面放一下代碼:

detector=vision.CascadeObjectDetector('LeftEyeCART');
input_image=imread('img3.jpg');
figure();imshow(input_image);title('原圖');
gauss_image=imgaussfilt(input_image,1);
eyes=step(detector,gauss_image);


size_eyes = size(eyes);%眼睛的狂
hold on;
for i =1:size_eyes(1);2
    eyes_final=eyes(i,1:2);%x,y
    image = imcrop(gauss_image,eyes(i,:));
    rectangle('Position',eyes(i,:),'edgeColor','b');

    image = rgb2gray(image);
    image = im2double(image);
    [grad_x,grad_y] = gradient(image);%計算梯度
    
    g = grad_x.*grad_x + grad_y.*grad_y;
    g = sqrt(g);%眼睛區域的梯度圖
    
    std_g = std(g(:));%計算標準差
    mean_g = mean(g(:));%計算平均值
    %其實這一步取得是< mean_g - 0.5*std_g和> mean_g + 0.5*std_g部分
    g_1 = g;
    g_1(g_1 < mean_g + 0.5*std_g) = 0;%梯度圖中小於均值+0.5*標準差的設置爲0
    
    g_2 = g;
    g_2(g_2 > mean_g - 0.5*std_g) = 0;%梯度圖中大於均值-0.5標準差的設置爲0
    
    g = g_1 + g_2;
    temp_g = g;
    w = 1-image;
    temp_g(temp_g ~= 0) = 1;%將不等於0的設置爲1 這該圖只有0和1兩個值
    grad_x = grad_x.*temp_g;%與梯度相成
    grad_y = grad_y.*temp_g;
    
    size_img = size(image);
    Dx = repmat(1:size_img(2),size_img(1),1);%每一行都是1-44
    Dy = repmat(transpose(1:size_img(1)),1,size_img(2));%轉置
    C_max = 0;
    X = 0;
    Y = 0;
    %爲了得出眼睛的中心位置
    for x = 1:size_img(2)
        for y = 1:size_img(1)
            D_x = Dx - x;
            D_y = Dy - y;
            
            D_t = D_x.*D_x + D_y.*D_y;
            E = sqrt(D_t);
            
            D_x = D_x./E;
            D_y = D_y./E;
            
            C_x = D_x.*grad_x;
            C_y = D_y.*grad_y;
            
            
            C = w(y,x)*(C_x + C_y);
            C(C < 0) = 0;
            ind = find(isnan(C));
            C(ind)=0;
            % C(isNaN(C)) = 0;
            
            total_C = sum(sum(C));
            
            if(total_C > C_max)
                C_max = total_C;
                X = x;
                Y = y;
            end
            
        end
    end
    plot(X+eyes_final(1),Y+eyes_final(2),'r+','MarkerSize',10);
    p(i,1)=X+eyes_final(1);
    p(i,2)=Y+eyes_final(2);
end

再展示幾張普通人的定位把:

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章