傳統(tǒng)的php裁剪類只能按位置裁剪。如按中間位置裁剪。這種裁剪方式可能會(huì)導(dǎo)致一個(gè)人被截成兩段。為了解決這個(gè)問(wèn)題,最近開(kāi)發(fā)了一個(gè)php擴(kuò)展(tclip),能自動(dòng)識(shí)別人臉或者圖像中其它重要區(qū)域,然后進(jìn)行裁剪。裁剪效果如下:
原圖:
如果按照從中間截取為 400 * 225 大小大圖片。效果如下:
使用tclip擴(kuò)展裁剪圖片效果如下:
在人臉識(shí)別的過(guò)程中,需要使用opencv中的CascadeClassifier加載一個(gè)xml的配置文檔。因?yàn)槲臋n比較大,導(dǎo)致加載時(shí)間比較長(zhǎng)。為了提高裁剪的效率,決定在php擴(kuò)展初始化的時(shí)候加載,并使用html' target='_blank'>全局變量存儲(chǔ)這個(gè)CascadeClassifier對(duì)象。這樣就可以在每次裁剪的時(shí)候直接使用這個(gè)配置文件,而無(wú)需再加載。
開(kāi)始,把php_tclip.h中的全局變量聲明部分修改為如下:
ZEND_BEGIN_MODULE_GLOBALS(tclip) CascadeClassifier face_cascade; char *face_config_path;ZEND_END_MODULE_GLOBALS(tclip)
結(jié)果報(bào)如下錯(cuò)誤:
error: ‘CascadeClassifier’ does not name a type
看來(lái)這個(gè)類沒(méi)有在頭文件中聲明。那就另辟蹊徑,改為其它方式。把代碼改為:
ZEND_BEGIN_MODULE_GLOBALS(tclip) void *face_cascade; char *face_config_path;ZEND_END_MODULE_GLOBALS(tclip)
然后在tclip.c中進(jìn)行了如下修改:
1.首先定義了一個(gè)全局變量。
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;}
調(diào)用全局對(duì)象的方式如下:
((CascadeClassifier *)TCLIP_G(face_cascade))->detectMultiScale( img_gray, faces, 1.1, 2, 0"CV_HAAR_SCALE_IMAGE, Size(30, 30) );
注意,php擴(kuò)展想線程安全,那就用相關(guān)宏來(lái)訪問(wèn)全局變量。如上面的TCLIP_G(face_cascade)。
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。
新聞熱點(diǎn)
疑難解答
圖片精選