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

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

代码:

 #include <opencv/cv.h>
#include <opencv/highgui.h>
#include <opencv_libs.h> #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#include <float.h>
#include <limits.h>
#include <time.h>
#include <ctype.h> /*
*《学习OpenCV》第四章第八题
* 完成时间:3:43 10/5 星期六 2013
* 作者:qdsclove@163.com
*/ /* Result window title */
#define WND_RESULT "result" static CvMemStorage* storage = ;
static CvHaarClassifierCascade* cascade = ; void detect_and_draw( IplImage* image ); const char* cascade_name =
"haarcascade_frontalface_alt.xml"; /* Skull image */
IplImage* g_skullImage; /* Trackbar initial value */
int g_trackbar_value = ;
/* Tackbar total values */
int g_trackbar_total = ; /* Alpha blend's alpha */
double g_alpha = ; /* Trackbar callback function */
void switch_callback(int pos)
{
printf("Trackbar event. pos: %d\n", pos);
g_alpha = (double)pos / g_trackbar_total;
} int main( )
{
CvCapture* capture = cvCreateCameraCapture();
if(!capture)
{
printf("Camera error.\n");
return -;
}
cascade_name = "haarcascade_frontalface_alt2.xml";
cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, , , ); if( !cascade )
{
printf( "ERROR: Could not load classifier cascade\n" );
return -;
} storage = cvCreateMemStorage();
cvNamedWindow( WND_RESULT, ); IplImage* frame = cvQueryFrame(capture);
if(!frame)
{
return -;
} // Load skull image
IplImage* skullImage = cvLoadImage("skull.jpg", CV_LOAD_IMAGE_UNCHANGED);
if(!skullImage)
{
printf("ERROR: Can't load skull image.\n");
return -;
}
g_skullImage = cvCreateImage(cvGetSize(skullImage), skullImage->depth, );
if(skullImage->nChannels != )
{
cvCvtColor(skullImage, g_skullImage, CV_GRAY2BGR);
}
else
{
cvCopy(skullImage, g_skullImage);
} // Create trackbar
cvCreateTrackbar("Switch", WND_RESULT, &g_trackbar_value,
g_trackbar_total, switch_callback );
// Initialize Alpha-Blend's alpha
g_alpha = (double)g_trackbar_value / g_trackbar_total; char c;
while( )
{
frame = cvQueryFrame(capture);
if(!frame)
{
return -;
} detect_and_draw( frame ); c = cvWaitKey();
if(c == )
{
break;
}
} cvDestroyWindow(WND_RESULT);
cvReleaseImage(&frame);
cvReleaseCapture(&capture);
cvReleaseImage(&skullImage);
cvReleaseImage(&g_skullImage); return ;
} void detect_and_draw(IplImage* img )
{
double scale=1.2;
static CvScalar colors[] = {
{{,,}},{{,,}},{{,,}},{{,,}},
{{,,}},{{,,}},{{,,}},{{,,}}
};//Just some pretty colors to draw with //Image Preparation
//
IplImage* gray = cvCreateImage(cvSize(img->width,img->height),,);
IplImage* small_img=cvCreateImage(cvSize(cvRound(img->width/scale),cvRound(img->height/scale)),,);
cvCvtColor(img,gray, CV_BGR2GRAY);
cvResize(gray, small_img, CV_INTER_LINEAR); cvEqualizeHist(small_img,small_img); //直方图均衡 //Detect objects if any
//
cvClearMemStorage(storage);
double t = (double)cvGetTickCount();
CvSeq* objects = cvHaarDetectObjects(small_img,
cascade,
storage,
1.1,
,
/*CV_HAAR_DO_CANNY_PRUNING*/,
cvSize(,)); t = (double)cvGetTickCount() - t;
printf( "detection time = %gms\n", t/((double)cvGetTickFrequency()*.) ); //Loop through found objects and draw boxes around them
for(int i=;i<(objects? objects->total:);++i)
{
CvRect* r=(CvRect*)cvGetSeqElem(objects,i); CvRect r_scale = cvRect( r->x * scale, r->y * scale, r->width * scale, r->height * scale );
// 改变骷髅头图像大小
IplImage * skullResize = cvCreateImage( cvSize(r_scale.width, r_scale.height),
g_skullImage->depth, g_skullImage->nChannels );
cvResize(g_skullImage, skullResize, CV_INTER_LINEAR); // 将人脸检测区域用骷髅头图像代替
cvSetImageROI(img, r_scale);
// b -- Alpha blend
printf("Alpha: %f\t", g_alpha);
cvAddWeighted( img, g_alpha, skullResize, 1.0 - g_alpha, 0.0, img);
/* This is a part
cvCopy(skullResize, img); */
cvResetImageROI(img);
cvReleaseImage(&skullResize); // cvRectangle(img, cvPoint(r->x*scale,r->y*scale), cvPoint((r->x+r->width)*scale,(r->y+r->height)*scale), colors[i%8]);
}
/* for( int i = 0; i < (objects? objects->total : 0); i++ )
{
CvRect* r = (CvRect*)cvGetSeqElem( objects, i );
CvPoint center;
int radius;
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);
cvCircle( img, center, radius, colors[i%8], 3, 8, 0 );
} */ cvShowImage( WND_RESULT, img );
cvReleaseImage(&gray);
cvReleaseImage(&small_img);
}

运行结果(此时的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. [原]1856-More is better-基础并查集

    思路:注意n为0的时候输出1,还有内存.这题是数据水了,要不我的Count[ ]数组,开10^5绝对会WA.离散化还没想清楚,想清楚了再更新代码.[水过代码下面是正经的AC代码,其实这道题不用离散化, ...

  2. spring.net异常处理

    接下来我们看一下SpringNetAop层的内容:此层主要是实现一些AOP的代码,以及特性和一个统一调用spring.net的类:记录日志我们使用Log4Net来实现: 1:Aspects 文件夹里存 ...

  3. Linux屏幕录制gif的工具及教程

    准备 要两个工具配合使用.它们可以用命令行安装,也可以用软件管理器安装. 1,byzanz     安装后有两个命令 byzanz-record   录制,既能录制 Gif 动画,又可录制 Ogv 视 ...

  4. ssh: Could not resolve hostname gitcafe.com: nodename nor servname provided, or not known

    今天 git push 的时候报如下错误: ssh: Could not resolve hostname gitcafe.com: nodename nor servname provided, o ...

  5. How to install Node.js on Linux

    How to install Node.js on Linux Posted on November 13, 2015 by Dan Nanni Leave a comment Question: H ...

  6. Android实现自定义字体

    介绍 最近在看开源项目的时候,发现里面涉及到了自定义字体,虽然自己目前还用不到,但是动手demo笔记记录一下还是有必要的,没准哪天需要到这个功能. 原理 1.其实实现起来非常简单,主要是用到了Type ...

  7. JS 原型链学习总结

    废话篇: 在js的学习过程中有一大难点就是原型链.学习的时候一直对这一内容不是十分的明白.纠结的我简直难受.,幸好总算给他弄通了,哇咔咔,总算可以不用在睡梦中还想着他了. 正文篇: 要了解原型链我们首 ...

  8. Linux多线程(三)(同步互斥)

    1. 线程的同步与互斥 1.1. 线程的互斥 在Posix Thread中定义了一套专门用于线程互斥的mutex函数.mutex是一种简单的加锁的方法来控制对共享资源的存取,这个互斥锁只有两种状态(上 ...

  9. js如何判断一个对象是不是Array

    typeof 操作符 对于Function, String, Number ,Undefined 等几种类型的对象来说,他完全可以胜任,但是为Array时 var arr=new Array(&quo ...

  10. HDU 1231 最大连续子序列

    和前面两道题一样 不过这题要求输出子序列首尾的元素的值,而且如果所有元素都小于0的话,规定子序列的和为0,并输出整个序列的首尾元素. //#define LOCAL #include <iost ...