傳統的php裁剪類只能按位置裁剪。如按中間位置裁剪。這種裁剪方式可能會導致乙個人被截成兩段。為了解決這個問題,最近開發了乙個php擴充套件(tclip),能自動識別人臉或者影象中其它重要區域,然後進行裁剪。裁剪效果如下:
原圖:
如果按照從中間擷取為 400 * 225 大小大。效果如下:
使用tclip擴充套件裁剪效果如下:
在人臉識別的過程中,需要使用opencv中的cascadeclassifier載入乙個xml的配置文件。因為文件比較大,導致載入時間比較長。為了提高裁剪的效率,決定在php擴充套件初始化的時候載入,並使用全域性變數儲存這個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)
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)。
php擴充套件中如何定義執行緒安全的全域性物件
傳統的php裁剪類只能按位置裁剪。如按中間位置裁剪。這種裁剪方式可能會導致乙個人被截成兩段。為了解決這個問題,最近開發了乙個php擴充套件 tclip 能自動識別人臉或者影象中其它重要區域,然後進行裁剪。裁剪效果如下 原圖 如果按照從中間擷取為 400 225 大小大。效果如下 使用tclip擴充套...
如何判斷PHP 是執行緒安全還是非執行緒安全的
什麼是執行緒安全與非執行緒安全?執行緒安全就是在多執行緒環境下也不會出現資料不一致,而非執行緒安全就有可能出現資料不一致的情況。執行緒安全由於要確保資料的一致性,所以對資源的讀寫進行了控制,換句話說增加了系統開銷。所以在單執行緒環境中效率比非執行緒安全的效率要低些,但是如果執行緒間資料相關,需要保證...
PHP執行緒安全與非執行緒安全的區別
原文 windows版的php從版本5.2.1開始有thread safe 執行緒安全 和none thread safe nts,非執行緒安全 之分,這兩者不同在於何處?到底應該用哪種?這裡做乙個簡單的介紹。因此,如果是使用isapi的方式來執行php就必須用thread safe 執行緒安全 的...