从视频中提取图片,对图片做人脸检测并截取人脸区域

环境配置:VS2013+opencv2.4.10+libface.lib

参考博客:http://blog.csdn.net/augusdi/article/details/11042329

http://www.1024do.com/?p=1296

首先给出视频处理的函数video_process.hpp

#include <stdio.h>
#include <opencv2/opencv.hpp>
#include "facedetect-dll.h"
#include<opencv2/highgui/highgui.hpp>  

#pragma comment(lib,"libfacedetect.lib")
//#pragma comment(lib,"libfacedetect-x64.lib")
using namespace cv;

#define DETECT_BUFFER_SIZE 0x20000 //facedetect
#define UNKNOWN_FLOW_THRESH 1e9  //facedetect

#define NUM_FRAME 100  //Video_to_imag中控制截取帧数

//函数声明
void Video_to_image(char* filename, char* Savepath);
/*
函数功能:读取视频的每一帧,并将其按帧数命名保存
例如:Video_to_image("F:\\tp\\1.mp4", "F:\\image");
*/
void video_to_image(char* Filename, char* Savepath);
/*
函数功能:截取视频前三帧图片并将其保存,帧数间隔默认5
可用count_tmp和jiangge控制读取帧数和帧数间隔
用法示例:video_to_image(videopath, "F:\\截图\\1_")
保存文件名为\\后字符和输入序号的拼接
*/
int image_cut(char* Filename, char* Savepath);
/*
函数功能:对图片进行人脸检测吧,并截取保存人脸及周边区域
其中用到了libfacedetect.lib
用法示例:image_cut("F:\\截图\\1_1.jpg","F:\\截图\\CUT1_1.jpg" );
*/

给出视频处理的函数video_process.cpp ,对应上面三个函数

#include<video_process.h>

void Video_to_image(char* filename, char* Savepath)
{
    printf("------------- video to image ... ----------------\n");

    CvCapture* capture = cvCaptureFromAVI(filename);//初始化一个视频文件捕捉器
    cvQueryFrame(capture);//获取视频信息
    int frameH = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT);
    int frameW = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH);
    int fps = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
    int numFrames = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT);
    printf("video height : %dntvideo width : %dntfps : %dntframe numbers : %dn", frameH, frameW, fps, numFrames);//打印视频信息
    //定义和初始化变量
    int i = 0;
    IplImage* img = 0;
    char image_name[18];

    cvNamedWindow("mainWin", CV_WINDOW_AUTOSIZE);

    //读取和显示
    while (1)
    {
        img = cvQueryFrame(capture); //获取一帧图片
        cvShowImage("mainWin", img); //将其显示
        char key = cvWaitKey(20);
        sprintf(image_name, "%s%d%s", Savepath, ++i, ".jpg");//保存的图片名
        cvSaveImage(image_name, img);
        //cvSaveImage( image_name, img);   //保存一帧图片
        if (i == 0)
        {
            sprintf(image_name, "%s//%d%s", Savepath, i, ".jpg");
            cvSaveImage(image_name, img);   //保存一帧图片
        }
        if (i == numFrames) break;
        //if (i == NUM_FRAME) break;
        i++;
    }
    cvReleaseCapture(&capture);
    cvDestroyWindow("mainWin");
    cvWaitKey();

}

void video_to_image(char* Filename, char* Savepath)
{
    printf("------------- video to image ... ----------------n");
    //初始化一个视频文件捕捉器
    CvCapture *capture = NULL;
    IplImage *frame = NULL;
    char *AviFileName = Filename;// "F:\\tp\\1.mp4";//视频的目录
    char *AviSavePath = Savepath;//"F:\\截图\\";//图片保存的位置
    const int jiange = 5;//间隔5帧保存一次图片
    capture = cvCaptureFromAVI(AviFileName);
    cvNamedWindow("AVI player", 1);
    int count_tmp = 0;//计数总帧数
    int i = 1;
    char tmpfile[100] = { ‘\0‘ };
    while (count_tmp<15)  //每段视频保留3帧
    {
        if (cvGrabFrame(capture))
        {
            if (count_tmp % jiange == 0)
            {
                frame = cvRetrieveFrame(capture);
                cvShowImage("AVI player", frame);//显示当前帧
                sprintf(tmpfile, "%s%d.jpg", AviSavePath, i);//使用帧号作为图片名
                cvSaveImage(tmpfile, frame);
                i++;
            }
            if (cvWaitKey(10) >= 0) //延时
                break;
            ++count_tmp;
        }
        else
        {
            break;
        }
    }
    cvReleaseCapture(&capture);
    cvDestroyWindow("AVI player");
    std::cout << "总帧数" << count_tmp << std::endl;
    cvWaitKey();
    return;
}

int image_cut(char* Filename, char* Savepath)
{
    Mat image = imread(Filename);
    if (image.empty())
    {
        fprintf(stderr, "Can not load the image file %s.\n");
        return -1;
    }
    Mat gray;
    cvtColor(image, gray, CV_BGR2GRAY);
    int * pResults = NULL;
    //pBuffer is used in the detection functions.
    //If you call functions in multiple threads, please create one buffer for each thread!
    unsigned char * pBuffer = (unsigned char *)malloc(DETECT_BUFFER_SIZE);
    if (!pBuffer)
    {
        fprintf(stderr, "Can not alloc buffer.\n");
        return -1;
    }

    int doLandmark = 1;
    ///////////////////////////////////////////
    // reinforced multiview face detection / 68 landmark detection
    // it can detect side view faces, better but slower than facedetect_multiview().
    //////////////////////////////////////////
    //!!! The input image must be a gray one (single-channel)
    //!!! DO NOT RELEASE pResults !!!
    pResults = facedetect_multiview_reinforce(pBuffer, (unsigned char*)(gray.ptr(0)), gray.cols, gray.rows, (int)gray.step,
        1.2f, 3, 48, 0, doLandmark);

    printf("%d faces detected.\n", (pResults ? *pResults : 0));
    int j = 0;
    Mat result_multiview_reinforce = image.clone();
    Mat image_cut = image.clone();
    //print the detection results

    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];

        printf("face_rect=[%d, %d, %d, %d], neighbors=%d, angle=%d\n", x, y, w, h, neighbors, angle);//(x,y)为检测到人脸左上角像素位置,w为宽,h为高
        rectangle(result_multiview_reinforce, Rect(x, y, w, h), Scalar(0, 255, 0), 0.5);
        int y1 = y - 100;
        int x1 = x - 90;
        int x2 = x + 285;
        int y2 = y + 345;
        if (y1 < 0) //超出边界判断
            y1 = 0;
        if (x1 < 0)
            x1 = 0;
        if (y2 >479)
            y2 = 479;
        if (x2>679)
            x1 = 679;
        image_cut = image_cut(Range(y1, y2), Range(x1, x2));
        //imshow("image_cut", image_cut);
        imwrite(Savepath, image_cut);

    }

    //release the buffer
    free(pBuffer);
    return 0;
}
时间: 2024-07-28 21:53:42

从视频中提取图片,对图片做人脸检测并截取人脸区域的相关文章

Opencv:视频中人脸检测并保存人脸图片

# OpenCV版本的视频检测 import cv2 # 图片识别方法封装 def discern(img): gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) cap = cv2.CascadeClassifier( "C:\Python36\Lib\site-packages\opencv-master\data\haarcascades\haarcascade_frontalface_default.xml" ) faceRects = c

利用 ffmpeg 的 maskedmerge 滤镜, 从视频中提取移动对象

ffmpeg -i background.png -i video.mkv -filter_complex " color=#00ff00:size=1280x720 [matte]; [1:0] format=rgb24, split[mask][video]; [0:0][mask] blend=all_mode=difference, curves=m='0/0 .1/0 .2/1 1/1', format=gray, smartblur=1, eq=brightness=30:contr

DEDECMS删除 提取第一个图片为缩略图 自动勾选默认选择设置方法

设置方法步骤: 第一步:登录FTP,依次找到 / dede / templets / article_add.htm 第二步:右击 article_add.htm 打开“编辑”.搜索并找到“删除非站内链接 1 <input name="autolitpic" type="checkbox" class="np" id="autolitpic" value="1"<?php if($cfg_arc

如何提取抖音短视频中的音乐

刷短视频的时候,总会有被一些短视频魔性的背景音乐吸引着,当我们准备下载这个背景音乐的时候,却又不知道这个背景音乐叫什么,所以无法下载.没办法,我们要想听这个背景音乐只能将音乐从视频中提取出来了,那么如何提取抖音短视频中的音乐呢?下面我们一起来看看吧. 音频转换器https://www.xunjieshipin.com/download-audioedit 我们提取音频,首先便是得下载一款音频编辑软件,这样我们才能够提取音频.下面这款迅捷音频转换器是小编平日里提取视频背景音乐所用的,因为操作简单,

怎么从视频里提取音乐

自从音频格式转换工具问世以来,就不断受到新媒体行业大佬的追捧,越来越多的短视频人员将使用它,用它制作音频,提取合并音频片段,很多人认为从视频中提取音乐是一件非常有难度的事情,其实不是这样的,你们的理解是错的,那是因为你没有完全它的使用技巧而已,下面就让小编来教大家如何用工具提取视频中的音乐吧,感兴趣的宝宝们赶紧看过来吧. 工具介绍: 迅捷音频转换器它是一款多功能的音频编辑处理软件,软件具有音频剪切.音频提取.音频合并和音频转换这四个功能,这款工具操作简单,功能强大可以多种分割方式进行音频剪切,操

从一段视频中按帧提取图片

这里实现的是从一段视频中每10帧读取第10帧图片,代码如下: # -*- coding:utf-8 -*- #视频中按序列提取帧,获得训练数据 import cv2 import os video_src_path = "D:/mtcnn" video_save_path = "D:/mtcnn/mydata" videos = os.listdir(video_src_path) videos = filter(lambda x : x.endswith(&quo

调用opencv相关函数,从视频流中提取出图片序列

/************************ @HJ 2017/3/30 参考http://blog.sina.com.cn/s/blog_4b0020f301010qcz.html修改的代码 @主要调用opencv相关函数,从视频流中提取出图片序列 @需要注意的问题: cvReleaseImage(&pImg)释放内存出错的两种情况:具体可以参考http://www.cnblogs.com/grandyang/p/4615036.html 1)从摄像头获取的图片不能被修改和释放,所以如果

PHP 正则表达式匹配 img ,PHP 正则提取或替换图片 img 标记中的任意属性。

PHP正则提取或替换img标记属性 PHP 正则表达式匹配 img ,PHP 正则提取或替换图片 img 标记中的任意属性. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 <?php /*PHP正则提取图片img标记中的任意属性*/ $str = '<center><img src="/uploads/images/20100516000.jpg"

使用NPOI从Excel中提取图片及图片位置信息

原文:使用NPOI从Excel中提取图片及图片位置信息 问题背景: 话说,在ExcelReport的开发过程中,有一个比较棘手的问题:怎么复制图片呢? 当然,解决这个问题的第一步是:能使用NPOI提取到图片及图片的位置信息.到这里,一切想法都很顺利.但NPOI到底怎么提取图片及图片的位置信息呢?NPOI能不能提取到图片的位置信息呢? 这是两个问题.是两个让BaiGoogleDu几近沉默的问题.但官方教程的评论中还是流露出了答案的蛛丝马迹. 哇咔咔,这是我去看源码寻答案的的动力. 此处省去(N多字