php扩展线程安全,php扩展中如何定义线程安全的全局对象

传统的php裁剪类只能按位置裁剪。如按中间位置裁剪。这种裁剪方式可能会导致一个人被截成两段。为了解决这个问题,最近开发了一个php扩展(tclip),能自动识别人脸或者图像中其它重要区域,然后进行裁剪。裁剪效果如下: 原图: 如果按照从中间截取为 400 *

传统的php裁剪类只能按位置裁剪。如按中间位置裁剪。这种裁剪方式可能会导致一个人被截成两段。为了解决这个问题,最近开发了一个php扩展(tclip),能自动识别人脸或者图像中其它重要区域,然后进行裁剪。裁剪效果如下:

原图:

b956c6bdb98ee2b42fef7238b2819c88.png

如果按照从中间截取为 400 * 225 大小大图片。效果如下:

1ec131aa23087d9be300443522d41532.png

使用tclip扩展裁剪图片效果如下:

eb5d23493cec3faf83f3d1748983ecef.png

在人脸识别的过程中,需要使用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值