php擴充套件中如何定義執行緒安全的全域性物件

2021-09-23 21:39:45 字數 1778 閱讀 4054

傳統的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 執行緒安全 的...