OpenCV(開源電腦視覺庫)是一個由 C/C++ 開發的強大圖像處理庫,擁有豐富的研究資料與社群支援。本文將詳細介紹如何在 PHP 中調用 OpenCV 的人臉偵測功能,從環境安裝到實際應用展示,幫助開發者快速構建具備人臉識別能力的 Web 應用。
首先從官方來源獲取源碼並編譯安裝:
# 下載源碼
wget https://sourceforge.net/project/showfiles.php?group_id=22870&package_id=16948
# 解壓並進入目錄
tar xvzf OpenCV-1.0.0.tar.gz
cd opencv-1.0.0
# 配置、編譯、安裝
./configure
make
make install
make check # 驗證安裝是否成功
注意:建議使用預設安裝路徑,避免後續編譯 PHP 擴展時找不到 OpenCV 庫文件。
facedetect 是專為 PHP 設計的 OpenCV 人臉偵測封裝擴展:
# 下載擴展源碼
wget https://www.xarg.org/download/facedetect-1.0.0.tar.gz
tar xzvf facedetect-1.0.0.tar.gz
cd facedetect-1.0.0
# 使用 phpize 編譯為 PHP 擴展
phpize && ./configure && make && make install
編譯完成後會提示 facedetect.so 的生成路徑,需將其加入 php.ini:
extension=facedetect.so
修改完成後重啟 Apache 使配置生效。
通過 phpinfo() 檢查是否載入 facedetect 模組。同時需將 OpenCV 源碼目錄下 data/haarcascades/ 中的所有 XML 分類器文件複製到 PHP 執行目錄。
face_count(image_path, cascade_xml):返回圖像中偵測到的人臉數量face_detect(image_path, cascade_xml):返回人臉位置陣列,每個元素包含 x、y 座標及寬高(w、h)<?php
// 檢測人臉數量
var_dump(face_count('party.jpeg', 'haarcascade_frontalface_alt.xml'));
// 獲取人臉位置詳情
$arr = face_detect('party.jpeg', 'haarcascade_frontalface_alt2.xml');
print_r($arr);
?>
利用 face_detect 返回的矩形區域,配合 Imagick 實現人臉區域的特效處理(如漩渦效果):
<?php
if ($_FILES) {
$img = $_FILES['pic']['tmp_name'];
$arr = face_detect($img, 'haarcascade_frontalface_alt2.xml');
$im = new Imagick($img);
if (is_array($arr)) {
foreach ($arr as $v) {
// 複製並裁剪人臉區域
$im_cl = $im->clone();
$im_cl->cropImage($v['w'], $v['h'], $v['x'], $v['y']);
// 應用漩渦效果
$im_cl->swirlImage(60);
// 合成回原圖
$im->compositeImage($im_cl, Imagick::COMPOSITE_OVER, $v['x'], $v['y']);
}
}
header("Content-Type: image/png");
echo $im;
} else {
?>
<form method="POST" enctype="multipart/form-data">
人臉識別測試(支援 JPG/PNG)<br>
上傳圖片 <input type="file" name="pic">
<input type="submit" value="上傳">
</form>
<?php } ?>