在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例图形和图像处理 → 史上最快人脸检测系统(超越OpenCV)

史上最快人脸检测系统(超越OpenCV)

图形和图像处理

下载此实例
  • 开发语言:C/C++
  • 实例大小:13.23M
  • 下载次数:64
  • 浏览次数:872
  • 发布时间:2019-03-19
  • 实例类别:图形和图像处理
  • 发 布 人:crazycode
  • 文件格式:.zip
  • 所需积分:2
 相关标签: 系统 c 人脸检测 检测 opencv

实例介绍

【实例简介】

【实例截图】

from clipboard

【核心代码】

#include <gst/gst.h>
#include <gst/base/gstbasetransform.h>
#include <gst/video/video.h>

#include <opencv2/opencv.hpp>
#include "facedetectcnn.h"

/*

Howto run?

GST_DEBUG=3 gst-launch-1.0 filesrc location=input.mp4 ! decodebin \
    ! videorate ! video/x-raw, framerate=8/1 \
    ! videoscale ! video/x-raw, width=640, height=480 \
    ! videoconvert \
    ! identity sync=true \
    ! queue max-size-buffers=3 leaky=1 \
    ! libfacedetect \
    ! videoconvert \
    ! xvimagesink sync=false
*/


#define TYPE_FACE_DETECT face_detect_get_type()
G_DECLARE_FINAL_TYPE (FaceDetect, face_detect, FACE, DETECT, GstBaseTransform)

struct _FaceDetect {
    GstBaseTransform element;

    guint width;
    guint height;
    guint thresh;
    gboolean boxes;
};

G_DEFINE_TYPE (FaceDetect, face_detect, GST_TYPE_BASE_TRANSFORM)

using namespace cv;

#define DEFAULT_THRESHHOLD 75
#define DEFAULT_BOXES TRUE

enum {
    PROP_0,
    PROP_THRESH,
    PROP_BOXES
};

static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE (
    "sink",
    GST_PAD_SINK,
    GST_PAD_ALWAYS,
    GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE("RGB"))
);

static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE (
    "src",
    GST_PAD_SRC,
    GST_PAD_ALWAYS,
    GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE("RGB"))
);

static void set_property( GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec ) {
    FaceDetect *self = FACE_DETECT(object);
    switch(prop_id) {
        case PROP_THRESH:
            self->thresh = g_value_get_uint(value);
            break;
        case PROP_BOXES:
            self->boxes = g_value_get_boolean(value);
            break;
        default:
            G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
            break;
    }
}

static void get_property( GObject *object, guint prop_id, GValue *value, GParamSpec *pspec ) {
    FaceDetect *self = FACE_DETECT(object);

    switch(prop_id) {
        case PROP_THRESH:
            g_value_set_uint(value, self->thresh);
            break;
        case PROP_BOXES:
            g_value_set_boolean(value, self->boxes);
            break;
        default:
            G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
            break;
    }
}

static gboolean set_caps(GstBaseTransform *trans, GstCaps *incaps, GstCaps *outcaps) {
    FaceDetect *self = FACE_DETECT(trans);
    GstVideoInfo info;

    if (gst_video_info_from_caps (&info, incaps) == FALSE) {
            return FALSE;
    }

    GST_INFO("New Width: %d Height: %d", info.width, info.height);
    self->width = info.width;
    self->height = info.height;

    return TRUE;
}

static GstFlowReturn transform_ip(GstBaseTransform *trans, GstBuffer *buf) {
    FaceDetect *self = FACE_DETECT(trans);
    GST_DEBUG("Processing");

    GstMapInfo info;
    if (gst_buffer_map(buf, &info, GST_MAP_WRITE) == FALSE) {
        GST_ERROR("Cannot map buffer");
        return GST_FLOW_ERROR;
    }
    Size size(self->width, self->height);
    Mat image(size, CV_8UC3, (void *) info.data);

    unsigned char *pBuffer = (unsigned char *) malloc(0x20000);
    int *pResults = facedetect_cnn(pBuffer, (unsigned char*)(image.ptr(0)), image.cols, image.rows, (int)image.step);

    for(int i = 0; i < (pResults ? *pResults : 0); i  ) {
        short * p = ((short*)(pResults 1)) 142*i;
        int x = p[0];
        int y = p[1];
        int w = p[2];
        int h = p[3];
        int neighbors = p[4];
        int angle = p[5];

        GST_ERROR("face_rect=[%d, %d, %d, %d], neighbors=%d, angle=%d", x,y,w,h,neighbors, angle);
        if (neighbors >= self->thresh) {
            if (self->boxes) {
                rectangle(image, Rect(x, y, w, h), Scalar(0, 255, 0), 2);
            }
        }
    }

    free(pBuffer);
    gst_buffer_unmap(buf, &info);
    return GST_FLOW_OK;
}

static void face_detect_init (FaceDetect *self)
{
    self->width = 0;
    self->height = 0;
    self->thresh = DEFAULT_THRESHHOLD;
    self->boxes = DEFAULT_BOXES;
}

static void face_detect_class_init (FaceDetectClass *klass)
{
    GObjectClass *object_class = G_OBJECT_CLASS (klass);
    GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
    GstBaseTransformClass *transform_class = GST_BASE_TRANSFORM_CLASS (klass);

    object_class->set_property = set_property;
    object_class->get_property = get_property;

    transform_class->set_caps = set_caps;
    transform_class->transform_ip = transform_ip;

    g_object_class_install_property(object_class, PROP_THRESH,
        g_param_spec_uint( "thresh", "thresh", "Thresh Hold as a percentage", 0, 100, DEFAULT_THRESHHOLD, G_PARAM_READWRITE)
    );

    g_object_class_install_property(object_class, PROP_BOXES,
        g_param_spec_boolean( "boxes", "boxes", "Draw boxes", DEFAULT_BOXES, G_PARAM_READWRITE)
    );

    gst_element_class_set_static_metadata(element_class,
        "Brightness",
        "Sink/Src/Caps",
        "Detects faces in images using libfacedetect",
        "James Stevenson <james@stev.org>"
    );

    gst_element_class_add_static_pad_template (element_class, &sink_factory);
    gst_element_class_add_static_pad_template (element_class, &src_factory);
}


extern "C" gboolean Register_init (GstPlugin *plugin) {
    return gst_element_register (plugin, "libfacedetect", GST_RANK_NONE, TYPE_FACE_DETECT);
}

#ifndef PACKAGE
#define PACKAGE "libfacedetect"
#endif

GST_PLUGIN_DEFINE (
    GST_VERSION_MAJOR,
    GST_VERSION_MINOR,
    facedetect,
    "Detect faces",
    Register_init,
    "0.0.0",
    "BSD",
    "facedetect",
    "https://github.com/ShiqiYu/libfacedetection"
)

实例下载地址

史上最快人脸检测系统(超越OpenCV)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警