php扩展中如何定义线程安全的全局对象
浏览:3057次 出处信息
传统的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)
{
/* 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)。
相关参考资料 http://www.laruence.com/2009/04/28/719.html
建议继续学习:
- Servlet线程安全问题 (阅读:5008)
- 深入研究PHP及Zend Engine的线程安全模型 (阅读:4960)
- 了解JS中的全局对象window.self和全局作用域self (阅读:2353)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:请注意PHP程序里的敏感信息
后一篇:Php session内部执行流程的再次剖析 >>
文章信息
- 作者:信海龙的博客 来源: 博学无忧
- 标签: tclip 全局对象 线程安全
- 发布时间:2013-07-28 15:46:01
近3天十大热文
-
[928] WordPress插件开发 -- 在插件使用 -
[134] 解决 nginx 反向代理网页首尾出现神秘字 -
[53] 整理了一份招PHP高级工程师的面试题 -
[52] 如何保证一个程序在单台服务器上只有唯一实例( -
[51] 海量小文件存储 -
[51] 用 Jquery 模拟 select -
[50] 全站换域名时利用nginx和javascri -
[50] Innodb分表太多或者表分区太多,会导致内 -
[49] CloudSMS:免费匿名的云短信 -
[47] jQuery性能优化指南



