根据滚动条位置缩放图像(学习OpenCV课后题 2.5)

来源:互联网 发布:什么软件可以听韩文歌 编辑:程序博客网 时间:2024/06/08 07:12

// 第二章 课后练习题
// 题号: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;   //获取缩放比例
}

原创粉丝点击