这道题是利用OpenCV例子程序里自带的人脸检测程序,做点图像的复制操作以及alpha融合。

说明:人脸检测的程序我参照了网上现有的例子程序,没有用我用的OpenCV版本(2.4.5)的facedetect.c,人脸检测部分是一个月前写的程序,这次做了点改动,以前的部分注释了起来。

代码:

  1. #include <opencv/cv.h>
  2. #include <opencv/highgui.h>
  3. #include <opencv_libs.h>
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <assert.h>
  9. #include <math.h>
  10. #include <float.h>
  11. #include <limits.h>
  12. #include <time.h>
  13. #include <ctype.h>
  14.  
  15. /*
  16. *《学习OpenCV》第四章第八题
  17. * 完成时间:3:43 10/5 星期六 2013
  18. * 作者:qdsclove@163.com
  19. */
  20.  
  21. /* Result window title */
  22. #define WND_RESULT "result"
  23.  
  24. static CvMemStorage* storage = ;
  25. static CvHaarClassifierCascade* cascade = ;
  26.  
  27. void detect_and_draw( IplImage* image );
  28.  
  29. const char* cascade_name =
  30. "haarcascade_frontalface_alt.xml";
  31.  
  32. /* Skull image */
  33. IplImage* g_skullImage;
  34.  
  35. /* Trackbar initial value */
  36. int g_trackbar_value = ;
  37. /* Tackbar total values */
  38. int g_trackbar_total = ;
  39.  
  40. /* Alpha blend's alpha */
  41. double g_alpha = ;
  42.  
  43. /* Trackbar callback function */
  44. void switch_callback(int pos)
  45. {
  46. printf("Trackbar event. pos: %d\n", pos);
  47. g_alpha = (double)pos / g_trackbar_total;
  48. }
  49.  
  50. int main( )
  51. {
  52. CvCapture* capture = cvCreateCameraCapture();
  53. if(!capture)
  54. {
  55. printf("Camera error.\n");
  56. return -;
  57. }
  58. cascade_name = "haarcascade_frontalface_alt2.xml";
  59. cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, , , );
  60.  
  61. if( !cascade )
  62. {
  63. printf( "ERROR: Could not load classifier cascade\n" );
  64. return -;
  65. }
  66.  
  67. storage = cvCreateMemStorage();
  68. cvNamedWindow( WND_RESULT, );
  69.  
  70. IplImage* frame = cvQueryFrame(capture);
  71. if(!frame)
  72. {
  73. return -;
  74. }
  75.  
  76. // Load skull image
  77. IplImage* skullImage = cvLoadImage("skull.jpg", CV_LOAD_IMAGE_UNCHANGED);
  78. if(!skullImage)
  79. {
  80. printf("ERROR: Can't load skull image.\n");
  81. return -;
  82. }
  83. g_skullImage = cvCreateImage(cvGetSize(skullImage), skullImage->depth, );
  84. if(skullImage->nChannels != )
  85. {
  86. cvCvtColor(skullImage, g_skullImage, CV_GRAY2BGR);
  87. }
  88. else
  89. {
  90. cvCopy(skullImage, g_skullImage);
  91. }
  92.  
  93. // Create trackbar
  94. cvCreateTrackbar("Switch", WND_RESULT, &g_trackbar_value,
  95. g_trackbar_total, switch_callback );
  96. // Initialize Alpha-Blend's alpha
  97. g_alpha = (double)g_trackbar_value / g_trackbar_total;
  98.  
  99. char c;
  100. while( )
  101. {
  102. frame = cvQueryFrame(capture);
  103. if(!frame)
  104. {
  105. return -;
  106. }
  107.  
  108. detect_and_draw( frame );
  109.  
  110. c = cvWaitKey();
  111. if(c == )
  112. {
  113. break;
  114. }
  115. }
  116.  
  117. cvDestroyWindow(WND_RESULT);
  118. cvReleaseImage(&frame);
  119. cvReleaseCapture(&capture);
  120. cvReleaseImage(&skullImage);
  121. cvReleaseImage(&g_skullImage);
  122.  
  123. return ;
  124. }
  125.  
  126. void detect_and_draw(IplImage* img )
  127. {
  128. double scale=1.2;
  129. static CvScalar colors[] = {
  130. {{,,}},{{,,}},{{,,}},{{,,}},
  131. {{,,}},{{,,}},{{,,}},{{,,}}
  132. };//Just some pretty colors to draw with
  133.  
  134. //Image Preparation
  135. //
  136. IplImage* gray = cvCreateImage(cvSize(img->width,img->height),,);
  137. IplImage* small_img=cvCreateImage(cvSize(cvRound(img->width/scale),cvRound(img->height/scale)),,);
  138. cvCvtColor(img,gray, CV_BGR2GRAY);
  139. cvResize(gray, small_img, CV_INTER_LINEAR);
  140.  
  141. cvEqualizeHist(small_img,small_img); //直方图均衡
  142.  
  143. //Detect objects if any
  144. //
  145. cvClearMemStorage(storage);
  146. double t = (double)cvGetTickCount();
  147. CvSeq* objects = cvHaarDetectObjects(small_img,
  148. cascade,
  149. storage,
  150. 1.1,
  151. ,
  152. /*CV_HAAR_DO_CANNY_PRUNING*/,
  153. cvSize(,));
  154.  
  155. t = (double)cvGetTickCount() - t;
  156. printf( "detection time = %gms\n", t/((double)cvGetTickFrequency()*.) );
  157.  
  158. //Loop through found objects and draw boxes around them
  159. for(int i=;i<(objects? objects->total:);++i)
  160. {
  161. CvRect* r=(CvRect*)cvGetSeqElem(objects,i);
  162.  
  163. CvRect r_scale = cvRect( r->x * scale, r->y * scale, r->width * scale, r->height * scale );
  164. // 改变骷髅头图像大小
  165. IplImage * skullResize = cvCreateImage( cvSize(r_scale.width, r_scale.height),
  166. g_skullImage->depth, g_skullImage->nChannels );
  167. cvResize(g_skullImage, skullResize, CV_INTER_LINEAR);
  168.  
  169. // 将人脸检测区域用骷髅头图像代替
  170. cvSetImageROI(img, r_scale);
  171. // b -- Alpha blend
  172. printf("Alpha: %f\t", g_alpha);
  173. cvAddWeighted( img, g_alpha, skullResize, 1.0 - g_alpha, 0.0, img);
  174. /* This is a part
  175. cvCopy(skullResize, img); */
  176. cvResetImageROI(img);
  177. cvReleaseImage(&skullResize);
  178.  
  179. // cvRectangle(img, cvPoint(r->x*scale,r->y*scale), cvPoint((r->x+r->width)*scale,(r->y+r->height)*scale), colors[i%8]);
  180. }
  181. /* for( int i = 0; i < (objects? objects->total : 0); i++ )
  182. {
  183. CvRect* r = (CvRect*)cvGetSeqElem( objects, i );
  184. CvPoint center;
  185. int radius;
  186. center.x = cvRound((r->x + r->width*0.5)*scale);
  187. center.y = cvRound((r->y + r->height*0.5)*scale);
  188. radius = cvRound((r->width + r->height)*0.25*scale);
  189. cvCircle( img, center, radius, colors[i%8], 3, 8, 0 );
  190. } */
  191.  
  192. cvShowImage( WND_RESULT, img );
  193. cvReleaseImage(&gray);
  194. cvReleaseImage(&small_img);
  195. }

运行结果(此时的alpha为0.2):

《学习OpenCV》练习题第四章第八题ab的更多相关文章

  1. 《学习OpenCV》练习题第四章第三题b

    #include <highgui.h> #include <cv.h> #include "opencv_libs.h" /* *<学习OpenCV ...

  2. 《学习OpenCV》练习题第四章第三题a

    #include <highgui.h> #include <cv.h> #include "opencv_libs.h" #pragma comment ...

  3. 《学习OpenCV》练习题第四章第七题abc

    题外话:一直是打算把这本书的全部课后编程题写完的,中间断了几个月,一直忙于其他事.现在开始补上. 这道题我不清楚我理解的题意是不是正确的,这道题可以练习用OpenCV实现透视变换(可以用于矫正在3维环 ...

  4. OpenCV实现的高斯滤波探究_1(《学习OpenCV》练习题第五章第三题ab部分)

    首先看下OpenCV 官方文档对于cvSmooth各个参数的解释: Smooths the image in one of several ways. C: void cvSmooth(const C ...

  5. 《学习OpenCV》 第四章 习题六

    实现的是一个图像标签编辑器,其间遇到了些问题还未解决或者可能解决方法上不是最优,若你有更好的思路可以提供给我,大恩不言谢啦!!☆⌒(*^-゜)v. #include "stdafx.h&qu ...

  6. 《学习OpenCV》练习题第四章第二题

    #include <highgui.h> #include <cv.h> #pragma comment (lib,"opencv_calib3d231d.lib&q ...

  7. 《学习OpenCV》练习题第四章第一题b&c

    #include <highgui.h> #include <cv.h> #pragma comment (lib,"opencv_calib3d231d.lib&q ...

  8. 《学习OpenCV》练习题第四章第一题a

    #include <highgui.h> #include <cv.h> #pragma comment (lib,"opencv_calib3d231d.lib&q ...

  9. 学习opencv中文版教程——第二章

    学习opencv中文版教程——第二章 所有案例,跑起来~~~然而并没有都跑起来...我只把我能跑的都尽量跑了,毕竟看书还是很生硬,能运行能出结果,才比较好. 越着急,心越慌,越是着急,越要慢,越是陌生 ...

随机推荐

  1. 如何修改linux时间? 校正linux系统的时间

    第一步:通过xshell远程连接到linux系统 第二步:输入 tzselect 第三步:选择所在的州,中国人请选择 5 ,亚洲 第四步:选择你所在的国家,中国人请选择9,中国 第五步:选择一个时区, ...

  2. OracleApps 什么是Back to Back Order?

    什么是Back to Back Order? 简单的说,B2B是我们从供应商那拿货,然后收到货后,再发运给客户.. B2B Flow B2B的例子 1.Item的定义 Item Should be c ...

  3. EditText控件实现只读

      android的EditText控件实现只读只需设置三个方法: editText.setCursorVisible(false);//隐藏光标 editText.setFocusable(fals ...

  4. Qt Creator介绍

    简介 Qt Creator是使用Qt开发的IDE.Qt支持Windows.Linux/Unix.Mac OS X.Android.BlackBerry.QNX等多种平台,Qt Creator为不同平台 ...

  5. div中文字水平和垂直居中的css代码

    HTML元素 <div>水平垂直居中</div> css样式 div{ width:200px;height:200px; /*设置div的大小*/ border:1px so ...

  6. ORACLE RAC集群硬件资源管理与单节点的区别

    硬件资源是由OS kernel管理的,应用软件是不能直接访问硬件的,必须通过OS kernel提供的API接口间接访问,OS kernel 除了要完成用户的请求,还通过进程调度等机制来控制多进程对资源 ...

  7. HBase 系统架构

    HBase是Apache Hadoop的数据库,能够对大型数据提供随机.实时的读写访问.HBase的目标是存储并处理大型的数据.HBase是一个开源的,分布式的,多版本的,面向列的存储模型.它存储的是 ...

  8. IOS公司开发者账号申请详细教程

    谈到苹果开发者账号,我们需要区分一下个人账号.公司账号和企业账号这三种,还有一种是教育账号,这个就不多说了. 个人账号:个人申请用于开发苹果app所使用的账号,仅限于个人使用,申请比较容易,$99. ...

  9. ios 页面传值4种方式(一) 之全局变量

    通用的是用代理的方式实现页面传值,但是有时候利用其它方式也可以很巧妙的解决问题,页面传值一共有4种方式: 1.使用全局变量, SharedApplication,定义一个变量来传递. 2.使用文件,或 ...

  10. 嵌入式 hi3518平台检测网线是否插上

    /********************************** (C) COPYRIGHT ******************************* * File Name        ...