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

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

代码:

  1. #include "stdafx.h"
  2. #include <opencv2\opencv.hpp>
  3. #include <opencv2/highgui/highgui.hpp>
  4. #include <opencv2/imgproc/imgproc.hpp>
  5. #include <opencv2/core/core.hpp>
  6. #include <opencv2/objdetect/objdetect.hpp>
  7. #include <iostream>
  8. #include <string>
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <assert.h>
  12. #include <math.h>
  13. #include <float.h>
  14. #include <limits.h>
  15. #include <time.h>
  16. #include <ctype.h>
  17. #include <io.h>
  18. using namespace cv;
  19. using namespace std;
  20. void detectAndDraw( Mat& img, CascadeClassifier& cascade,
  21. CascadeClassifier& nestedCascade,
  22. double scale, bool tryflip );
  23. int main(int argc, char** argv)
  24. {
  25. CascadeClassifier cascade, nestedCascade;
  26. bool stop = false;
  27. //训练好的文件名称,放置在可执行文件同目录下
  28. cascade.load("haarcascade_frontalface_alt.xml");
  29. nestedCascade.load("haarcascade_eye_tree_eyeglasses.xml");
  30. // 图片集
  31. string fileFolderPath = "F:\\picture";
  32. string fileExtension = "jpg";
  33. string fileFolder = fileFolderPath + "\\*." + fileExtension;
  34. int codec = 0;
  35. double frameRate = 1;
  36. CvSize frameSize;
  37. struct _finddata_t fileInfo; // 文件信息结构体
  38. // 1. 第一次查找
  39. long findResult = _findfirst(fileFolder.c_str(), &fileInfo);
  40. if (findResult == -1)
  41. {
  42. _findclose(findResult);
  43. return -1;
  44. }
  45. //2.设置视频的宽度和高度为 读取到的图片的最大宽度和最大高度
  46. int width = 0 ;
  47. int height = 0 ;
  48. IplImage* img;
  49. string file_path ;
  50. do
  51. {
  52. string temp_name = fileInfo.name;
  53. file_path = fileFolderPath + "\\" + temp_name ;
  54. img = cvLoadImage(file_path.c_str()); // 读入图片
  55. if(img->width > width)
  56. {
  57. width = img->width ;
  58. }
  59. if(img->height > height)
  60. {
  61. height = img->height ;
  62. }
  63. } while (!_findnext(findResult, &fileInfo));
  64. _findclose(findResult);
  65. // 3.生成视频
  66. frameSize.width = width ;
  67. frameSize.height = height ;
  68. int zero_H = 0 ;
  69. int zero_W = 0 ;
  70. CvVideoWriter* writer = cvCreateVideoWriter("output.avi",CV_FOURCC('X','V','I','D'),frameRate,frameSize);
  71. cvNamedWindow("Pic2avi",0);
  72. cvNamedWindow("img");
  73. struct _finddata_t fileInfo2; // 文件信息结构体
  74. long findResult2 = _findfirst(fileFolder.c_str(), &fileInfo2);
  75. if (findResult2 == -1)
  76. {
  77. _findclose(findResult2);
  78. return -1;
  79. }
  80. do
  81. {
  82. string t_name = fileInfo2.name;
  83. string t_file_path = fileFolderPath + "\\" + t_name ;
  84. IplImage* frame = cvLoadImage(t_file_path.c_str(), 1); // 读入图片
  85. cvShowImage("img", frame);
  86. IplImage* temp_frame = cvCreateImage(frameSize, IPL_DEPTH_8U, 3) ;
  87. if(frame->width <= frameSize.width)
  88. {
  89. zero_W = (frameSize.width - frame->width) / 2 ;
  90. }
  91. if(frame->height <= frameSize.height)
  92. {
  93. zero_H = (frameSize.height - frame->height) / 2 ;
  94. }
  95. CvRect roi =cvRect(zero_W, zero_H, frame->width, frame->height);
  96. cvSetImageROI(temp_frame,roi) ;
  97. cvResize(frame, temp_frame);
  98. cvResetImageROI(temp_frame) ;
  99. detectAndDraw( cv::Mat(temp_frame) , cascade, nestedCascade,2,0 );
  100. cvWriteFrame(writer,temp_frame);
  101. cvShowImage("Pic2avi", temp_frame);
  102. cvWaitKey(100);
  103. frame = NULL ;
  104. temp_frame = NULL ;
  105. } while (!_findnext(findResult2, &fileInfo2));
  106. _findclose(findResult2);
  107. return 0;
  108. }
  109. void detectAndDraw( Mat& img, CascadeClassifier& cascade,
  110. CascadeClassifier& nestedCascade,
  111. double scale, bool tryflip )
  112. {
  113. int i = 0;
  114. double t = 0;
  115. //建立用于存放人脸的向量容器
  116. vector<Rect> faces, faces2;
  117. //定义一些颜色,用来标示不同的人脸
  118. const static Scalar colors[] = { CV_RGB(0,0,255),
  119. CV_RGB(0,128,255),
  120. CV_RGB(0,255,255),
  121. CV_RGB(0,255,0),
  122. CV_RGB(255,128,0),
  123. CV_RGB(255,255,0),
  124. CV_RGB(255,0,0),
  125. CV_RGB(255,0,255)} ;
  126. //建立缩小的图片,加快检测速度
  127. //nt cvRound (double value) 对一个double型的数进行四舍五入,并返回一个整型数!
  128. Mat gray, smallImg( cvRound (img.rows/scale), cvRound(img.cols/scale), CV_8UC1 );
  129. //转成灰度图像,Harr特征基于灰度图
  130. cvtColor( img, gray, CV_BGR2GRAY );
  131. //改变图像大小,使用双线性差值
  132. resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR );
  133. //变换后的图像进行直方图均值化处理
  134. equalizeHist( smallImg, smallImg );
  135. //程序开始和结束插入此函数获取时间,经过计算求得算法执行时间
  136. t = (double)cvGetTickCount();
  137. //检测人脸
  138. //detectMultiScale函数中smallImg表示的是要检测的输入图像为smallImg,faces表示检测到的人脸目标序列,1.1表示
  139. //每次图像尺寸减小的比例为1.1,2表示每一个目标至少要被检测到3次才算是真的目标(因为周围的像素和不同的窗口大
  140. //小都可以检测到人脸),CV_HAAR_SCALE_IMAGE表示不是缩放分类器来检测,而是缩放图像,Size(30, 30)为目标的
  141. //最小最大尺寸
  142. cascade.detectMultiScale( smallImg, faces,
  143. 1.1, 2, 0
  144. //|CV_HAAR_FIND_BIGGEST_OBJECT
  145. //|CV_HAAR_DO_ROUGH_SEARCH
  146. |CV_HAAR_SCALE_IMAGE
  147. ,
  148. Size(30, 30));
  149. //如果使能,翻转图像继续检测
  150. if( tryflip )
  151. {
  152. flip(smallImg, smallImg, 1);
  153. cascade.detectMultiScale( smallImg, faces2,
  154. 1.1, 2, 0
  155. //|CV_HAAR_FIND_BIGGEST_OBJECT
  156. //|CV_HAAR_DO_ROUGH_SEARCH
  157. |CV_HAAR_SCALE_IMAGE
  158. ,
  159. Size(30, 30) );
  160. for( vector<Rect>::const_iterator r = faces2.begin(); r != faces2.end(); r++ )
  161. {
  162. faces.push_back(Rect(smallImg.cols - r->x - r->width, r->y, r->width, r->height));
  163. }
  164. }
  165. t = (double)cvGetTickCount() - t;
  166. // qDebug( "detection time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) );
  167. for( vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++, i++ )
  168. {
  169. Mat smallImgROI;
  170. vector<Rect> nestedObjects;
  171. Point center;
  172. Scalar color = colors[i%8];
  173. int radius;
  174. double aspect_ratio = (double)r->width/r->height;
  175. if( 0.75 < aspect_ratio && aspect_ratio < 1.3 )
  176. {
  177. //标示人脸时在缩小之前的图像上标示,所以这里根据缩放比例换算回去
  178. center.x = cvRound((r->x + r->width*0.5)*scale);
  179. center.y = cvRound((r->y + r->height*0.5)*scale);
  180. radius = cvRound((r->width + r->height)*0.25*scale);
  181. circle( img, center, radius, color, 3, 8, 0 );
  182. }
  183. else
  184. rectangle( img, cvPoint(cvRound(r->x*scale), cvRound(r->y*scale)),
  185. cvPoint(cvRound((r->x + r->width-1)*scale), cvRound((r->y + r->height-1)*scale)),
  186. color, 3, 8, 0);
  187. if( nestedCascade.empty() )
  188. continue;
  189. smallImgROI = smallImg(*r);
  190. //同样方法检测人眼
  191. nestedCascade.detectMultiScale( smallImgROI, nestedObjects,
  192. 1.1, 2, 0
  193. //|CV_HAAR_FIND_BIGGEST_OBJECT
  194. //|CV_HAAR_DO_ROUGH_SEARCH
  195. |CV_HAAR_DO_CANNY_PRUNING
  196. //|CV_HAAR_SCALE_IMAGE
  197. ,
  198. Size(30, 30) );
  199. for( vector<Rect>::const_iterator nr = nestedObjects.begin(); nr != nestedObjects.end(); nr++ )
  200. {
  201. center.x = cvRound((r->x + nr->x + nr->width*0.5)*scale);
  202. center.y = cvRound((r->y + nr->y + nr->height*0.5)*scale);
  203. radius = cvRound((nr->width + nr->height)*0.25*scale);
  204. circle( img, center, radius, color, 3, 8, 0 );
  205. }
  206. }
  207. cv::imshow( "result", img );
  208. }

代码中,

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

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

OpenCV人脸检测并把图片写成avi视频的更多相关文章

  1. Android+openCV人脸检测2(静态图片)

    前几篇文章中有提到对openCV环境配置,这里再重新梳理导入和使用openCV进行简单的人脸检测(包括使用级联分类器) 一 首先导入openCVLibrary320 二 设置gradle的sdk版本号 ...

  2. keras系列︱人脸表情分类与识别:opencv人脸检测+Keras情绪分类(四)

    引自:http://blog.csdn.net/sinat_26917383/article/details/72885715 人脸识别热门,表情识别更加.但是表情识别很难,因为人脸的微表情很多,本节 ...

  3. opencv人脸检测,旋转处理

    年会签到,拍自己的大头照,有的人可能会拍成横向的,需要旋转,用人脸检测并修正它(图片). 1. 无脑检测步骤为: 1. opencv 读取图片,灰度转换 2. 使用CascadeClassifier( ...

  4. opencv人脸检测分类器训练小结

    这两天在初学目标检测的算法及步骤,其中人脸检测作为最经典的算法,于是进行了重点研究.该算法最重要的是建立人脸检测分类器,因此我用了一天的时间来学习分类器的训练.这方面的资料很多,但是能按照一个资料运行 ...

  5. Android人脸检测1(静态图片)

    搭建Android人脸识别环境花了很长时间(可以查看之前的文章),解决Android开发中的杂七杂八小问题也耗时不少. 今天记录一下,点击选择照片或者拍照上传照片进行人脸检测的小demo. (andr ...

  6. 人脸检测学习笔记(数据集-DLIB人脸检测原理-DLIB&OpenCV人脸检测方法及对比)

    1.Easily Create High Quality Object Detectors with Deep Learning 2016/10/11 http://blog.dlib.net/201 ...

  7. OpenCV——人脸检测

    OpenCV支持的目标检测的方法: 利用样本的Haar特征进行的分类器训练,得到的级联boosted分类器(Cascade Classification) 1.加载级联分类器 CascadeClass ...

  8. OpenCV x64 vs2010 下打开摄像头录制视频写成avi(代码为转载)

    首先参照下面这里进行opencv x64位机器下面的配置 http://wiki.opencv.org.cn/index.php/VC_2010%E4%B8%8B%E5%AE%89%E8%A3%85O ...

  9. OpenCV: OpenCV人脸检测框可信度排序

    参考文章:http://blog.csdn.net/hua_007/article/details/45368607 使用OpenCV进行人脸识别时,使用 casecade.detectMultiSc ...

随机推荐

  1. pdb

    core code: import pdb pdb.set_trace() 单步执行并进入:s 单步执行并不进入:n 下一断点:c 当前位置:where 从当前函数返回:r 退出:q pdb comm ...

  2. HDU1158:Employment Planning(线性dp)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1158 这题又是看了题解,题意是一项工作需要n个月完成,雇佣一个人需要m1的钱,一个人的月工资为sa,辞退一 ...

  3. delphi webbrowser post自动登录

    delphi webbrowser post自动登录     var  EncodedDataString: WideString;  PostData: OleVariant;  Headers: ...

  4. java要注意的问题3

    十七.使用正则 正则表达式的结构摘录如下(来源: Oracle官网) 字符 x 字符x / 反斜杠 /0n 8进制值为0n的字符(0<=n<=7) /0nn   /0mnn 8进制值为0m ...

  5. HDU 6356 Glad You Came 2018 Multi-University Training Contest 5 (线段树)

    题目中没有明说会爆int和longlong 的精度,但是在RNG函数中不用unsigned int 会报精度,导致队友debug了很久... 根据每次生成的l,r,v对区间更新m次,然后求 i*ai的 ...

  6. JVM(4) 虚拟机性能监控与故障处理工具

    1. Sun JDK 监控和故障处理工具 1)jps:JVM process Status Tool,显示指定系统内所有的HotSpot虚拟机进程.可以列出正在运行的虚拟机进程,并显示虚拟机执行主类( ...

  7. JS与Jquery 中的extend用法不同

    1, Jquery //jQuery 应用扩展   jQuery.extend({                  // 定义setApDiv     setApDiv:function () {  ...

  8. Dubbo与微服务

    http访问到服务器要经过的内容:Nginx —Tomcat –db,nginx就是一个负载均衡左右.又一次面试问到了我nginx的反向代理.现在想了想面试官要问的应该是 域名的反向代理,就是使用一个 ...

  9. [翻译]在gulp构建工具中使用PostCSS

    前言 PostCSS已经在一段时间内迅速普及,如果你还不知道PostCSS或还没有使用它,我建议你看一下之前的一篇介绍文章<PostCSS简介>,其中介绍了使用PostCSS的基本方法,包 ...

  10. Kruskal算法-最小生成树

    2017-07-26  10:32:07 writer:pprp Kruskal算法是根据边的加权值以递增的方式,一次找出加权值最低的边来建最小生成树:并且每次添加的边不能造成生成树有回路,直到找到N ...