OpenCV人脸检测并把图片写成avi视频

  读出某一个文件夹下“jpg”后缀的全部图片后,用的OpenCV自带的人脸检测检测图片中的人脸,调整图片的大小写成一个avi视频。

  主要是要记录一下CvVideoWriter的用法和如何从文件夹中读取某一后缀的全部文件。

代码:

#include "stdafx.h"#include <opencv2\opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <iostream>
#include <string>#include <stdio.h> 
#include <stdlib.h> 
#include <assert.h> 
#include <math.h> 
#include <float.h> 
#include <limits.h> 
#include <time.h> 
#include <ctype.h>
#include <io.h>  using namespace cv;
using namespace std;void detectAndDraw( Mat& img, CascadeClassifier& cascade,CascadeClassifier& nestedCascade,double scale, bool tryflip );int main(int argc, char** argv)  
{  CascadeClassifier cascade, nestedCascade;bool stop = false;//训练好的文件名称,放置在可执行文件同目录下cascade.load("haarcascade_frontalface_alt.xml");nestedCascade.load("haarcascade_eye_tree_eyeglasses.xml");// 图片集  string fileFolderPath = "F:\\picture";  string fileExtension = "jpg";  string fileFolder = fileFolderPath + "\\*." + fileExtension;  int codec = 0;  double frameRate = 1;  CvSize frameSize;  struct _finddata_t fileInfo;    // 文件信息结构体// 1. 第一次查找  long findResult = _findfirst(fileFolder.c_str(), &fileInfo);            if (findResult == -1)  {  _findclose(findResult);   return -1;  }  //2.设置视频的宽度和高度为 读取到的图片的最大宽度和最大高度int width = 0 ;int height = 0 ;IplImage* img;  string file_path ;do   {string temp_name =  fileInfo.name;file_path = fileFolderPath + "\\" +  temp_name ;img = cvLoadImage(file_path.c_str());    // 读入图片 if(img->width > width){width = img->width ;}if(img->height > height){height = img->height ;}} while (!_findnext(findResult, &fileInfo));_findclose(findResult); // 3.生成视频  frameSize.width  = width ;frameSize.height = height ;int zero_H = 0 ;int zero_W = 0 ;CvVideoWriter* writer = cvCreateVideoWriter("output.avi",CV_FOURCC('X','V','I','D'),frameRate,frameSize);cvNamedWindow("Pic2avi",0);cvNamedWindow("img");  struct _finddata_t fileInfo2;    // 文件信息结构体long findResult2 = _findfirst(fileFolder.c_str(), &fileInfo2);            if (findResult2 == -1)  {  _findclose(findResult2);   return -1;  }  do   {  string t_name =  fileInfo2.name;string t_file_path = fileFolderPath + "\\" +  t_name ;IplImage* frame = cvLoadImage(t_file_path.c_str(), 1);    // 读入图片cvShowImage("img", frame); IplImage* temp_frame = cvCreateImage(frameSize, IPL_DEPTH_8U, 3) ;if(frame->width <= frameSize.width){zero_W = (frameSize.width - frame->width) / 2 ;}if(frame->height <= frameSize.height){zero_H = (frameSize.height - frame->height) / 2 ;}CvRect roi =cvRect(zero_W, zero_H, frame->width, frame->height);cvSetImageROI(temp_frame,roi) ;cvResize(frame, temp_frame);cvResetImageROI(temp_frame) ;detectAndDraw( cv::Mat(temp_frame) , cascade, nestedCascade,2,0 );cvWriteFrame(writer,temp_frame); cvShowImage("Pic2avi", temp_frame);   cvWaitKey(100);frame = NULL ;temp_frame = NULL ;} while (!_findnext(findResult2, &fileInfo2));    _findclose(findResult2);   return 0;  
}  void detectAndDraw( Mat& img, CascadeClassifier& cascade,CascadeClassifier& nestedCascade,double scale, bool tryflip )
{int i = 0;double t = 0;//建立用于存放人脸的向量容器vector<Rect> faces, faces2;//定义一些颜色,用来标示不同的人脸const static Scalar colors[] =  { CV_RGB(0,0,255),CV_RGB(0,128,255),CV_RGB(0,255,255),CV_RGB(0,255,0),CV_RGB(255,128,0),CV_RGB(255,255,0),CV_RGB(255,0,0),CV_RGB(255,0,255)} ;//建立缩小的图片,加快检测速度//nt cvRound (double value) 对一个double型的数进行四舍五入,并返回一个整型数!Mat gray, smallImg( cvRound (img.rows/scale), cvRound(img.cols/scale), CV_8UC1 );//转成灰度图像,Harr特征基于灰度图cvtColor( img, gray, CV_BGR2GRAY );//改变图像大小,使用双线性差值resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR );//变换后的图像进行直方图均值化处理equalizeHist( smallImg, smallImg );//程序开始和结束插入此函数获取时间,经过计算求得算法执行时间t = (double)cvGetTickCount();//检测人脸//detectMultiScale函数中smallImg表示的是要检测的输入图像为smallImg,faces表示检测到的人脸目标序列,1.1表示//每次图像尺寸减小的比例为1.1,2表示每一个目标至少要被检测到3次才算是真的目标(因为周围的像素和不同的窗口大//小都可以检测到人脸),CV_HAAR_SCALE_IMAGE表示不是缩放分类器来检测,而是缩放图像,Size(30, 30)为目标的//最小最大尺寸cascade.detectMultiScale( smallImg, faces,1.1, 2, 0//|CV_HAAR_FIND_BIGGEST_OBJECT//|CV_HAAR_DO_ROUGH_SEARCH|CV_HAAR_SCALE_IMAGE,Size(30, 30));//如果使能,翻转图像继续检测if( tryflip ){flip(smallImg, smallImg, 1);cascade.detectMultiScale( smallImg, faces2,1.1, 2, 0//|CV_HAAR_FIND_BIGGEST_OBJECT//|CV_HAAR_DO_ROUGH_SEARCH|CV_HAAR_SCALE_IMAGE,Size(30, 30) );for( vector<Rect>::const_iterator r = faces2.begin(); r != faces2.end(); r++ ){faces.push_back(Rect(smallImg.cols - r->x - r->width, r->y, r->width, r->height));}}t = (double)cvGetTickCount() - t;//   qDebug( "detection time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) );for( vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++, i++ ){Mat smallImgROI;vector<Rect> nestedObjects;Point center;Scalar color = colors[i%8];int radius;double aspect_ratio = (double)r->width/r->height;if( 0.75 < aspect_ratio && aspect_ratio < 1.3 ){//标示人脸时在缩小之前的图像上标示,所以这里根据缩放比例换算回去center.x = cvRound((r->x + r->width*0.5)*scale);center.y = cvRound((r->y + r->height*0.5)*scale);radius = cvRound((r->width + r->height)*0.25*scale);circle( img, center, radius, color, 3, 8, 0 );}elserectangle( img, cvPoint(cvRound(r->x*scale), cvRound(r->y*scale)),cvPoint(cvRound((r->x + r->width-1)*scale), cvRound((r->y + r->height-1)*scale)),color, 3, 8, 0);if( nestedCascade.empty() )continue;smallImgROI = smallImg(*r);//同样方法检测人眼nestedCascade.detectMultiScale( smallImgROI, nestedObjects,1.1, 2, 0//|CV_HAAR_FIND_BIGGEST_OBJECT//|CV_HAAR_DO_ROUGH_SEARCH|CV_HAAR_DO_CANNY_PRUNING//|CV_HAAR_SCALE_IMAGE,Size(30, 30) );for( vector<Rect>::const_iterator nr = nestedObjects.begin(); nr != nestedObjects.end(); nr++ ){center.x = cvRound((r->x + nr->x + nr->width*0.5)*scale);center.y = cvRound((r->y + nr->y + nr->height*0.5)*scale);radius = cvRound((nr->width + nr->height)*0.25*scale);circle( img, center, radius, color, 3, 8, 0 );}}cv::imshow( "result", img );
}

代码中,

CvVideoWriter* writer = cvCreateVideoWriter("output.avi",CV_FOURCC('X','V','I','D'),frameRate,frameSize);

这部分用来设置生成的avi视频的各个参数。
  
注释中的1和2就是从文件夹中读取某一后缀的全部文件。

 

转载于:https://www.cnblogs.com/betterwgo/p/6561444.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/417884.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TextArea换行 滚动条

换行"\r\n" 滚动条自动滚动到结尾document.form1.text_information.doScroll(down); 滚动条顶部坐标document.form1.text_information.scrollTop; textarea自动滚动到结尾function add_information(info)//添加信息{ document.form1.text_information.valuedocument.…

leetcode83,删除有序链表中的重复元素

Given a sorted linked list, delete all duplicates such that each element appear only once. For example, Given 1->1->2, return 1->2. Given 1->1->2->3->3, return 1->2->3. 难点就一个&#xff0c;就是要考虑到连续3个和3个以上的情况。 …

javascript各种事件

事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElement.setCapture(); event.srcElement.releaseCapture(); 事件按键 event.keyCode event.shiftKey event.altKey event.ctrlKey 事件返回值 event.returnValue 鼠标位置 event.x event.y 窗…

mysql limit asc_MySql sql优化之order by desc/asc limit M-阿里云开发者社区

Order by desc/asc limit M是我在mysql sql优化中经常遇到的一种场景&#xff0c;其优化原理也非常的简单&#xff0c;就是利用索引的有序性&#xff0c;优化器沿着索引的顺序扫描&#xff0c;在扫描到符合条件的M行数据后&#xff0c;停止扫描&#xff1b;看起来非常的简单&am…

Spring 4 官方文档学习(十)数据访问之JDBC

说明&#xff1a;未修订版&#xff0c;阅读起来极度困难 1、Spring框架JDBC的介绍 Spring JDBC - who does what? 动作Spring你定义连接参数 是打开连接是 指定SQL语句 是声明参数&#xff0c;提供参数值 是准备、执行语句是 迭代结果&#xff08;如果有&#xff09;是 操作每…

fopen -- 打开文件或者 URL

fopen (PHP 3, PHP 4, PHP 5) fopen -- 打开文件或者 URL 说明 resource fopen ( string filename, string mode [, bool use_include_path [, resource zcontext]] ) fopen() 将 filename 指定的名字资源绑定到一个流上。如果 filename 是 "scheme://..." 的格式&am…

mysql 性能状态_MySQL获取系统性能和状态_MySQL

bitsCN.comMySQL获取系统性能和状态#!/bin/ksh INTERVAL5 PREFIX$INTERVAL-sec-status touch /tmp/running RUNFILE/tmp/running my -e show global variables >> mysql-variables while test -e $RUNFILE; do file$(date %F_%I) sleep$(date %s.%N | awk "{print $…

洛谷P3392 涂国旗

P3392 涂国旗 107通过507提交题目提供者kkksc03标签难度普及-提交 讨论 题解 最新讨论 直接读字符会waWA?--为什么不对。。。跪求找错快点给钱这不就是荷兰国旗问题吗题目描述 某国法律规定&#xff0c;只要一个由N*M个小方块组成的旗帜符合如下规则&#xff0c;就是合法的…

php小问题

///PHP显示错误;display_errors Offdisplay_errors on ///PHP截取字符串$str1234567890;怎么从左边第二位截取到右边数第二位&#xff1f;取其中间。 $str 1234567890;print substr($str, 1, strlen($str)-2); ///php获取时间date("Y年m月d日"); 2008年4月6日date…

mysql5.7.11 创建用户_修改更新查找MySQL5.7.x的root用户的默认密码

最近新安装了wamp3.0.4里面附带的mysql已经升级到了5.7版本了。MySQL5.7在性能方面有很大的提升。安装成功之后默认root的密码为空能登录。但是正常情况下需要给root重新设置新的密码。对于MySQL5.7版本来说和之前的5.6及以下版本的user表不一样了(user表里面没有了password这个…

协方差

协方差一般用来研究诸多实验中各个变量之间的关系。举个例子来说&#xff0c;有n个实验&#xff0c;每个实验得到两个数据&#xff0c;分别为变量x1和变量x2。设n 7。这七组实验得到的数据分别为&#xff1a; (3,5), (4,5.5),(2,4),(6,7),(8,10),(2,5),(5,7.5) 用MATLAB…

预定义变量$_SERVER

PHP的getenv函数的参数列表$_SERVER["HTTP_X_FORWARDED_FOR"] 以阻止普通的匿名代理 $spager$_SERVER["SERVER_NAME"]; or$spagergetenv(SERVER_NAME); “PHP_SELF”当前正在执行脚本的文件名&#xff0c;与 document root 相关。举例来说…

mysql教程为什么很多都用dos_在dos操作mysql基础教程详解

第一招、mysql服务的启动和停止net stop mysqlnet start mysql第二招、登陆mysql语法如下&#xff1a; mysql -u用户名 -p用户密码键入命令mysql -uroot -p&#xff0c; 回车后提示你输入密码&#xff0c;输入12345&#xff0c;然后回车即可进入到mysql中了&#xff0c;mysql的…

今天刚开通博客,很开心

今天刚开通博客&#xff0c;很开心&#xff0c;我是一名大三的一名学生&#xff0c;机电专业的&#xff0c;下个月都要出去实习&#xff0c;很忐忑&#xff0c;也对外面的世界充满这憧憬.....明天继续&#xff0c;今天太晚了。转载于:https://www.cnblogs.com/namei/p/6002480.…

postgresql查询mysql库_postgresql 查看数据库,表,索引,表空间以及大小

客户要求用pgsql&#xff0c;所在服务器装了一下pgsql&#xff0c;我出了一个pgsql的分类&#xff0c;看这篇文章前&#xff0c;把这个分类下的文章都可以看一下&#xff0c;这是我熟悉pgsql的一套流程。以前搞过一次pgsql&#xff0c;很早了。1,查看数据库playboy> \l //\加…

配置linux系统自带apache+php+mysql

######################配置apache服务####################################cd /etc/httpd/conf#gedit httpd.conf#编辑配置文件Listen 80Listen 10.1.8.39:8080#添加监听端口LoadModule php5_module /usr/lib/httpd/modules/libphp5.soAddType application/x-httpd-php .php …

行为类模式(二):命令(Command)

定义 将一个请求封装成一个对象&#xff0c;从而让你使用不同的请求把客户端参数化&#xff0c;对请求排队或者记录请求日志&#xff0c;可以提供命令的撤销和恢复功能。 UML 优点 能比较容易的设计一个命令队列可以较容易的将命令加入日志允许接收请求的一方是否处理请求可以容…

win7 nginx mysql php_windows7配置Nginx+php+mysql的详细教程

最近在学习PHP&#xff0c;想把自己的学习经历记录下来&#xff0c;并写一些经验&#xff0c;仅供参考交流。此文适合那些刚刚接触PHP&#xff0c;想要学习并想要自己搭建NginxPHPMysqL环境的同学。当然&#xff0c;你也可以选择集成好的安装包&#xff0c;比如 wamp等&#xf…

我的虚拟化设想(My virtualization vision)

王洪岐&#xff08;Wang Hongqi&#xff09; 当前的服务器虚拟化技术所虚拟的操作系统都是完整的操作系统&#xff0c;我认为这样会在一定程度上造成了资源的浪费和技术难度的增加&#xff1a;多个操作系统就有多个操作硬件设备的操作程序&#xff0c;虚拟平台要在操作系统底层…

mysql start with connect by_MYSQL实现Oracle的Start with…Connect By递归树查询

最近接触一个老项目&#xff0c;最初适配的数据库是oracle 后来迁移到mysql 。这个迁移是由一个已经离职的新手做的。这个新手对于很多oracle特有的函数及存储过程都没有进行迁移。导致系统很多功能都BUG了。失效了。既然我遇到了&#xff0c;就尽量进行解决。刚刚遇到了一个存…