开始,把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)。
参考资料 php扩展中如何定义线程安全的全局对象
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。