OpenCV中文网站

 找回密码
 立即注册
搜索
热搜: 安装 配置
查看: 7919|回复: 10

python人脸检测之调用于老师公开的动态链接库。

[复制链接]
发表于 2018-8-2 11:23:13 | 显示全部楼层 |阅读模式
经过多天学习,终于了解了python如何调用于老师提供的人脸检测动态库,感觉检测速度很快,CPU占用率在50%左右(09年的神舟笔记本),本着开源的精神,与大家坦诚交流的态度,现将源码放出,一起学习,不足之处多指正。

---------------------------------------------------------------------------帅气的分割线---------------------------------------------------------------------------------

def detectFaceC(image):
        # 调用Dll动态链接库
        import ctypes

        DETECT_BUFFER_SIZE = 0x20000  # 设置缓存大小
        sBuf = b'a'*DETECT_BUFFER_SIZE  # 设置缓存,用于存储识别数据
        pStr = ctypes.cast(sBuf, ctypes.POINTER(ctypes.c_short))  # 缓存指针,用于读取缓存数据
        dll = ctypes.CDLL('libfacedetect.dll')  # 调用脸部识别动太链接库

        # 动态链接库功能调用方法,有三种:1. dll.funname() 2. fun=getattr(dll, '?funname@HYY***@@Z') 3. dll[num]
        # 不同库可能调用的方法不一样,下面是这个库的调用方法。
        # facedetect_front = dll[1]  # 脸检测, 无检测角度
        # facedetect_frontal_surveillance = dll[2]  # 暗光线下检测,无检测角度
        # facedetect_multiview = dll[3]  # 脸部角度检测
        # facedetect_multiview_reinforce = dll[4]  # 加强版脸部角度检测

        imggray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        row, col = imggray.shape[:2]
        doLandmark = 1
        result = dll[1](sBuf, imggray.ctypes.data, col, row, col, ctypes.c_float(1.2), 2, 48, 0, doLandmark)

        for i in range(pStr[0]):
                p = 2 + 142*i
                # 显示脸部坐标,neighbors,angle
                print('x1:',pStr[p], 'y1:', pStr[p+1], 'x2:', pStr[p]+pStr[p+2], 'y2:', pStr[p+1]+pStr[p+3], 'neighbors:', pStr[p+4], 'angle:', pStr[p+5])
                cv2.rectangle(image, (pStr[p], pStr[p+1]), (pStr[p]+pStr[p+2], pStr[p+1]+pStr[p+3]), (0,0,255), 2)
                if doLandmark:
                        for j in range(68):
                                # circle(result_frontal, Point((int)p[6 + 2 * j], (int)p[6 + 2 * j + 1]), 1, Scalar(0, 255, 0))
                                cv2.circle(image, (pStr[p+6+2*j], pStr[p+6+2*j+1]), 2, (0,255,0))
        return image



回复

使用道具 举报

发表于 2018-8-2 17:29:14 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-2 21:31:00 | 显示全部楼层

其实更应该给于老师点赞!于老师,人脸检测有了,能不能再给我们介绍下人脸识别有什么成熟、识别率高的算法!?真心期待!!!
回复 支持 反对

使用道具 举报

发表于 2018-10-4 21:50:40 | 显示全部楼层
ctypes.ArgumentError: argument 2: <class 'OverflowError'>: int too long to convert
我用的是64位的动态链接库,python3.6版本。想请问上面的问题您是否出现过?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-20 16:26:04 | 显示全部楼层
64位有点不一样,主要是指针方面的问题,这样修改下:

        pImg = ctypes.cast(imggray.ctypes.data, ctypes.POINTER(ctypes.c_byte))
        result = dll[4](sBuf, pImg, col, row, col, ctypes.c_float(1.1), 2, 48, 0, doLandmark)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-20 16:28:00 | 显示全部楼层
君唯 发表于 2018-10-4 21:50
ctypes.ArgumentError: argument 2: : int too long to convert
我用的是64位的动态链接库,python3.6版本 ...

问题解决了么,如果没有,我在5楼有回答!
回复 支持 反对

使用道具 举报

发表于 2018-11-19 12:20:01 | 显示全部楼层
楼主,太感谢了,你实现的python语言和64位的问题刚好解决了我发愁的问题
回复 支持 反对

使用道具 举报

发表于 2018-11-22 22:28:15 | 显示全部楼层
您好,我最近在做人脸聚类,想借用于老师的人脸检测,借用Dlib的人脸聚类,但是两者的接口处调不明白,如果您用时间还请您指导一下
回复 支持 反对

使用道具 举报

发表于 2018-11-25 10:27:36 | 显示全部楼层
大家需要注意到,现在随着技术的不断进步,opencv已经集成了dnn的人脸检测算法,其能力比传统方法好许多,有这样一篇文章《人脸识别的前世今生:从人工特征的百花齐放到深度学习的一统江湖》非常好地说明了这个问题,推荐看一下!
回复 支持 反对

使用道具 举报

发表于 2018-11-26 18:06:58 | 显示全部楼层
君唯 发表于 2018-11-22 22:28
您好,我最近在做人脸聚类,想借用于老师的人脸检测,借用Dlib的人脸聚类,但是两者的接口处调不明白,如果 ...

已调好
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|OpenCV中文网站

GMT+8, 2024-4-25 12:00 , Processed in 0.010789 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表