傳統的php裁剪類只能按位置裁剪。如按中間位置裁剪。這種裁剪方式可能會導致一個人被截成兩段。為了解決這個問題,最近開發了一個php擴展(tclip),能自動識別人臉或者圖像中其它重要區域,然后進行裁剪。裁剪效果如下:
原圖:
如果按照從中間截取為 400 * 225 大小大圖片。效果如下:
使用tclip擴展裁剪圖片效果如下:
在人臉識別的過程中,需要使用opencv中的CascadeClassifier加載一個xml的配置文檔。因為文檔比較大,導致加載時間比較長。為了提高裁剪的效率,決定在php擴展初始化的時候加載,并使用html' target='_blank'>全局變量存儲這個CascadeClassifier對象。這樣就可以在每次裁剪的時候直接使用這個配置文件,而無需再加載。
開始,把php_tclip.h中的全局變量聲明部分修改為如下:
ZEND_BEGIN_MODULE_GLOBALS(tclip) CascadeClassifier face_cascade; char *face_config_path;ZEND_END_MODULE_GLOBALS(tclip)
結果報如下錯誤:
error: ‘CascadeClassifier’ does not name a type
看來這個類沒有在頭文件中聲明。那就另辟蹊徑,改為其它方式。把代碼改為:
ZEND_BEGIN_MODULE_GLOBALS(tclip) void *face_cascade; char *face_config_path;ZEND_END_MODULE_GLOBALS(tclip)
然后在tclip.c中進行了如下修改:
1.首先定義了一個全局變量。
static CascadeClassifier face_cascade;
2.修改PHP_MINIT_FUNCTION(tclip)。代碼如下:
PHP_MINIT_FUNCTION(tclip){ /* If you have INI entries, uncomment these lines */ REGISTER_INI_ENTRIES(); string face_config_path = (TCLIP_G(face_config_path) == "" "| TCLIP_G(face_config_path) == NULL)? "/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml" :TCLIP_G(face_config_path); if( !face_cascade.load( face_config_path ) ){ php_error_docref(NULL TSRMLS_CC, E_WARNING, "can not load classifier file!%s", face_config_path.c_str()); return FAILURE; } TCLIP_G(face_cascade) = &face_cascade; return SUCCESS;}
調用全局對象的方式如下:
((CascadeClassifier *)TCLIP_G(face_cascade))->detectMultiScale( img_gray, faces, 1.1, 2, 0"CV_HAAR_SCALE_IMAGE, Size(30, 30) );
注意,php擴展想線程安全,那就用相關宏來訪問全局變量。如上面的TCLIP_G(face_cascade)。
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答