2017-01-02 91 views
0

我維護一個網站,其中包含與列表相關的大約30,000張圖像的數據庫。這些圖像具有許多不同的尺寸和高寬比,因此爲了在網站上以統一的方式呈現這些圖像,我編寫了一個功能,使我能夠以特定的高寬比響應地呈現圖像。使用人臉檢測座標計算背景位置

function image($src,$aspect) { 
    $html = '<img class="img-responsive" src="furniture/blank-'.$aspect.'.png" style="background:url(\''.$src.'\');background-position:center center;background-size:cover;" >'; 
    return $html; 
} 

以我「傢俱」的文件夾我在所需的寬高比的一組透明PNG文件來強制使實際圖像成爲背景的容器的大小。因此,例如,有一個4x3.png文件,它只是一張4像素寬,3像素高的空白圖形,可以用圖像調用('path/to/image.jpg','4x3') - 效果很好。

但是,問題出現在圖像中有人的面部時,因爲默認的「中心」定位有時會切斷頭部。

我已經完成了人臉檢測的步驟,數據庫中的每個記錄都有一個標誌,表示在圖像中是否找到了人臉,如果是,則顯示X,Y和寬度值。然後,這個問題試圖找出背景位置,因爲我正在處理響應式佈局,所以不知道圖像顯示的大小。

我假設我需要遵循的邏輯是;

IF圖像具有面對它 然後設置背景位置垂直方向的偏移基於Y計算的臉 ELSE 背景位置設置爲中心中心點座標

如何找出記住圖像大小的垂直偏移值的值是未知的?

+0

您最後需要保存在數據庫中的圖像的寬高比。沒有這個,你無法計算未知數。 –

回答

0

好吧,所以想出了這一個,但在這裏張貼,以防萬一任何人都在與它掙扎。

基本邏輯是基於實際圖像的寬度來計算方面窗口的高度(無需擔心此階段的響應性)。然後,您可以找到圖像的理想中心點放置在框架中,並確定該點是高於還是低於圖像在您的方向窗口內的滑動範圍。

我把它放到我調用的函數中,然後直接將結果放到background-position CSS中。

在下文中,將變量爲:

  • 美元給圖像
  • $ aspect1 =例如IMG =路徑16(如果16x9)
  • $ aspect2 =例如9(如果16×9)
  • $面臨=設置爲1,如果圖像具有在它檢測到的面部
  • 面部區域的面部的頂部
  • $ faceW =寬度(和高度)的

  • $ faceY = Y像素

    function calcImagePosition($img,$aspect1,$aspect2,$faceD,$faceY,$faceW) { 
        if($faceD==1) { // Only do this if there's a face in the image 
         list($width, $height) = getimagesize($_SERVER['DOCUMENT_ROOT']."/".$img); // Get the image dimensions 
         $aspectHeight = ($width/$aspect1)*$aspect2; // Get the height of the aspect window based on the actual width of the image 
         $idealCentre = $faceY + ($faceW/2); // The best part of the image to appear in the aspect window is halfway down the face bounds 
         if($idealCentre<($aspectHeight/2)) { // if the ideal centre is higher than half the height of the aspect window, just set it to top 
          $position = "center top"; 
         } elseif(($height-$idealCentre)<($aspectHeight/2)) { // Also, if there's less than half the height of the aspect window at the bottom, set it to bottom 
          $position = "center bottom"; 
         } else { // This will slide the position to best match the face 
          $pixel = $idealCentre-($aspectHeight/2); // Get the absolute pixel value 
          $percent = intval(($pixel/$height)*100); // Convert this to a percentage so it doesn't matter about responsive sizing 
          $position = "center ".$percent."%"; 
         } 
        } else { 
         $position = "center center"; // default for no face detection 
        } 
        return $position; 
    } 
    

我與面部檢測這確實創造需要$ faceY和$ faceW數據的合理工作的KARTHIK Tharavaad的PHP接口結合使用這一點。