[imagenet]20 [imagenet]20 请问第八题怎么做请解释

这道题是利用OpenCV例子程序里自带的人脸检测程序,做点图像的复制操作以及alpha融合。
说明:人脸检测的程序我参照了网上现有的例子程序,没有用我用的OpenCV版本(2.4.5)的facedetect.c,人脸检测部分是一个月前写的程序,这次做了点改动,以前的部分注释了起来。
1 #include &opencv/cv.h&
2 #include &opencv/highgui.h&
3 #include &opencv_libs.h&
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&
*《学习OpenCV》第四章第八题
* 完成时间:3:43 10/5 星期六 2013
22 /* Result window title */
23 #define
WND_RESULT
25 static CvMemStorage* storage = 0;
26 static CvHaarClassifierCascade* cascade = 0;
28 void detect_and_draw( IplImage* image );
30 const char* cascade_name =
"haarcascade_frontalface_alt.xml";
33 /* Skull image */
34 IplImage* g_skullI
36 /* Trackbar initial value */
37 int g_trackbar_value = 5;
38 /* Tackbar total values */
39 int g_trackbar_total = 10;
41 /* Alpha blend's alpha */
42 double g_alpha = 0;
44 /* Trackbar callback function */
45 void switch_callback(int pos)
printf("Trackbar event.
pos: %d\n", pos);
g_alpha = (double)pos / g_trackbar_
51 int main( )
CvCapture* capture = cvCreateCameraCapture(0);
if(!capture)
printf("Camera error.\n");
return -1;
cascade_name = "haarcascade_frontalface_alt2.xml";
cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );
if( !cascade )
printf( "ERROR: Could not load classifier cascade\n" );
return -1;
storage = cvCreateMemStorage(0);
cvNamedWindow( WND_RESULT, 1 );
IplImage* frame = cvQueryFrame(capture);
if(!frame)
return -1;
// Load skull image
IplImage* skullImage = cvLoadImage("skull.jpg", CV_LOAD_IMAGE_UNCHANGED);
if(!skullImage)
printf("ERROR: Can't load skull image.\n");
return -1;
g_skullImage = cvCreateImage(cvGetSize(skullImage), skullImage-&depth, 3);
if(skullImage-&nChannels != 3)
cvCvtColor(skullImage, g_skullImage, CV_GRAY2BGR);
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_
while( 1 )
frame = cvQueryFrame(capture);
if(!frame)
return -1;
detect_and_draw( frame );
c = cvWaitKey(50);
if(c == 27)
cvDestroyWindow(WND_RESULT);
cvReleaseImage(&frame);
cvReleaseCapture(&capture);
cvReleaseImage(&skullImage);
cvReleaseImage(&g_skullImage);
128 void detect_and_draw(IplImage* img )
double scale=1.2;
static CvScalar colors[] = {
{{0,0,255}},{{0,128,255}},{{0,255,255}},{{0,255,0}},
{{255,128,0}},{{255,255,0}},{{255,0,0}},{{255,0,255}}
};//Just some pretty colors to draw with
//Image Preparation
IplImage* gray = cvCreateImage(cvSize(img-&width,img-&height),8,1);
IplImage* small_img=cvCreateImage(cvSize(cvRound(img-&width/scale),cvRound(img-&height/scale)),8,1);
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,
0/*CV_HAAR_DO_CANNY_PRUNING*/,
cvSize(30,30));
t = (double)cvGetTickCount() -
printf( "detection time = %gms\n", t/((double)cvGetTickFrequency()*1000.) );
//Loop through found objects and draw boxes around them
for(int i=0;i&(objects? objects-&total:0);++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 );
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):
阅读(...) 评论()

我要回帖

更多关于 imagemagick 的文章

 

随机推荐