// 第二章 课后练习题
// 题号:2.5
// 功能:读取摄像头中的数据,并为显示图像的窗口中添加一个Slider
// 根据Slider的位置,等比缩放视频显示窗口中显示图像的大小
#include "cv.h"
#include "highgui.h"
#pragma comment(lib,"cv.lib")
#pragma comment(lib,"cvcam.lib")
#pragma comment(lib,"cxcore.lib")
#pragma comment(lib,"highgui.lib")
IplImage *doPyrDown(IplImage *input,int filter=CV_GAUSSIAN_5x5); //doPyrDown函数声明
void MyTrackbarCallback(int pos); //slider的回调函数的声明
int decrease; //根据slider的当前位置,确定缩放比例
void main()
{
//创建一个从摄像头中获取图像的capture指针
CvCapture *capture=cvCreateCameraCapture(0);
assert(capture!=NULL);
//从capture中获取图像
IplImage *image=cvQueryFrame(capture);
assert(image!=NULL);
//获得图像的总帧数,该参数在此处没有使用,可注释掉,因为从摄像头获取的帧数为0
int frames=(int)cvGetCaptureProperty(capture,CV_CAP_PROP_POS_FRAMES);
//创建图像显示窗口
cvNamedWindow("Show",CV_WINDOW_AUTOSIZE);
//创建TrackBar
cvCreateTrackbar("Scalar","Show",&decrease,8,MyTrackbarCallback);
//当从摄像头中获取图像成功后,进入循环
while ((image=cvQueryFrame(capture))!=NULL)
{
if (0==decrease || 1==decrease)
{
cvShowImage("Show",image);
}
else
{
//如果缩放比例大于等于2,先将图像缩放一次,使convert_image指向缩放后的图像
IplImage *convert_image;
convert_image=doPyrDown(image);
//如果缩放比例大于2进入循环进行第二次等比缩小
for (int i=2;i<decrease;i++)
{
convert_image=doPyrDown(convert_image);
}
//翻转图像以正常显示
cvConvertImage(convert_image,convert_image,CV_CVTIMG_FLIP);
cvShowImage("Show",convert_image);
}
cvWaitKey(30);
}
//释放资源
cvReleaseCapture(&capture);
cvDestroyWindow("Show");
}
/*******************************************************************/
/* 函数名 : doPyrDown() 执行图形的向下图像金字塔
/* 参数 : input 输入图像
/* filter cvPyrDown()的默认参数
/* 功能 : 将输入图像input缩小一倍,并返回指向经过缩小处理图像的指针
/*******************************************************************/
IplImage *doPyrDown(IplImage *input,int filter)
{
//确保图像宽度和高度能被2整除
assert(input->width%2==0 && input->height%2==0);
IplImage *output=cvCreateImage(cvSize(input->width/2,input->height/2),
input->depth,
input->nChannels);
assert(output!=NULL);
//对图像进行缩放处理
cvPyrDown(input,output,CV_GAUSSIAN_5x5);
return(output);
}
/***************************************************************
/*函数名:MyTrackbarCallback() 所属窗口中指定slider的回调函数
/* 参数:pos 所传入的当前slider的位置
/* 功能:记录当前slider的pos位置,并将其存入g_trackbar_postion返回
/****************************************************************/
void MyTrackbarCallback(int pos)
{
decrease=pos; //获取缩放比例
}