IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

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

博学无忧 2013-07-28 15:46:01 累计浏览 3,551 次
本机暂存

   传统的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

同分类推荐文章

  1. 从”内容治理”到”行为治理”:中国智能体治理框架深度解析与绿盟科技实践 (2026-06-23 21:49:28)
  2. 美团海报生成 AIGC 技术创新与实践 (2026-06-22 15:34:28)
  3. AI Coding Agent 时代,我自己最常用的 4 个终端工具 (2026-06-22 08:00:00)

查看更多 AI 文章 →

建议继续学习

  1. 精于图片处理的10款jQuery插件 (累计阅读 7,366)
  2. Servlet线程安全问题 (累计阅读 5,423)
  3. PHP 模块编写需要注意的一个问题---- php模块及函数名都定义成小写吧 (累计阅读 4,415)
  4. photoshop图像点运算算法揭秘 (累计阅读 4,298)
  5. [图片处理]PHP对非标准格式的图片pjpeg上传失败的解决办法 (累计阅读 4,262)
  6. APP图标的色彩 (累计阅读 4,056)
  7. 前端开发常见图片格式详解 (累计阅读 4,022)
  8. HTML5 Canvas(画布)教程 (累计阅读 3,664)
  9. Imagick::thumbnailImage用法 (累计阅读 3,649)
  10. 浅析视频搜索中的清晰度识别过程 (累计阅读 3,583)