动态调整窗口大小并进行灰度变换
代码如下:
#include "stdafx.h"
#include <cv.h>
#include <highgui.h>
const char* Title="avi视频播放并自定义窗口大小";
const char* GrayTitle="可变窗口";
IplImage *Image;
IplImage *GrayImage;
CvCapture *avi;
CvSize GrayImageSize;
bool WindowChangeFlag=FALSE;
//滑块回调函数
void OnChange(int pos)
{
//改变窗口标志位置位
WindowChangeFlag=true;
}
int _tmain(int argc, _TCHAR* argv[])
{
double AVI_FrameCount;
int DelayTime_ms;
int WindowSize=100;
//加载avi
avi=cvCaptureFromAVI("Javaw.avi");
if(avi==0)//文件不支持
{
printf("加载视频错误!\r\n");
system("pause");
return 0;
}
//获取视频帧率
AVI_FrameCount=cvGetCaptureProperty(avi,CV_CAP_PROP_FPS);
//获取每一帧的延时时间
DelayTime_ms=1000/(int)AVI_FrameCount;
//创建窗口
cvNamedWindow(Title,CV_WINDOW_AUTOSIZE);
cvNamedWindow(GrayTitle,CV_WINDOW_AUTOSIZE);
//创建一个滑动块
cvCreateTrackbar("调节窗口大小",Title,&WindowSize,150,OnChange);
//获取视频1帧的图像
Image=cvQueryFrame(avi);
//设置尺寸
GrayImageSize.height=Image->height;
GrayImageSize.width=Image->width;
//创建临时灰度转换容器
IplImage* _tGrayImage=cvCreateImage(GrayImageSize,IPL_DEPTH_8U,1);
//给灰度图创建一个图片容器
GrayImage=cvCreateImage(GrayImageSize,IPL_DEPTH_8U,1);
while(Image)
{
if(WindowChangeFlag)//检测窗口改变标志位
{
WindowChangeFlag=FALSE;
//删除掉原来的
cvReleaseImage(&GrayImage);
//重新计算尺寸
GrayImageSize.height=Image->height*WindowSize/100;
GrayImageSize.width=Image->width*WindowSize/100;
//创建一个新的容器
GrayImage=cvCreateImage(GrayImageSize, IPL_DEPTH_8U, 1);
}
//转换为灰度图
cvCvtColor(Image,_tGrayImage,CV_RGB2GRAY);
//缩放图片 (CV_INTER_LINEAR:使用象素关系重采样)
cvResize(_tGrayImage,GrayImage,CV_INTER_LINEAR);
//显示图片
cvShowImage(Title,Image);
cvShowImage(GrayTitle,GrayImage);
//帧延时
cvWaitKey(DelayTime_ms);
//获取视频1帧的图像
Image=cvQueryFrame(avi);
}
//等待任意按键
cvWaitKey();
//销毁窗口
cvDestroyWindow(Title);
cvDestroyWindow(GrayTitle);
//释放占用的资源
cvReleaseImage(&Image);
cvReleaseImage(&_tGrayImage);
cvReleaseImage(&GrayImage);
cvReleaseCapture(&avi);
return 0;
}
效果:
这次主要用到了几个新的函数
在窗口上创建滑动块、彩色图转灰度图、修改图片尺寸
窗口上创建滑动块函数
CVAPI(int) cvCreateTrackbar( const char* trackbar_name, const char* window_name,
int* value, int count, CvTrackbarCallback on_change CV_DEFAULT(NULL));
int* value, int count, CvTrackbarCallback on_change CV_DEFAULT(NULL));
参数1 trackbar_name:滑块名称
参数2window_name :显示到窗口名称
参数3value :滑块初始位置
参数4 count :滑块最大值
参数5 on_change :void (*)(int)型回调函数,当滑块改变时就会调用传入的函数地址
彩色图转灰度图函数
CVAPI(void) cvCvtColor( const CvArr* src, CvArr* dst, int code );
参数1 src:源图片
参数2 dst:目标容器
参数3 code:转换类型
类型有:
CV_BGR2GRAY
CV_RGB2GRAY
CV_GRAY2BGR
CV_GRAY2RGB
CV_GRAY2BGRA
CV_GRAY2RGBA
CV_BGRA2GRAY
CV_RGBA2GRAY
CV_RGB2GRAY
CV_GRAY2BGR
CV_GRAY2RGB
CV_GRAY2BGRA
CV_GRAY2RGBA
CV_BGRA2GRAY
CV_RGBA2GRAY
修改图片尺寸函数
CVAPI(void) cvResize( const CvArr* src, CvArr* dst,
int interpolation CV_DEFAULT( CV_INTER_LINEAR ));
int interpolation CV_DEFAULT( CV_INTER_LINEAR ));
参数1 src:源图片
参数2 dst:目标容器
参数3 interpolation:转换类型
转换类型有:
CV_INTER_NN最近-邻居插补
CV_INTER_LINEAR双线性插值(默认方法)
CV_INTER_AREA 像素面积相关重采样。当缩小图像时,该方法可以避免波纹的出现。当放大图像时,类似于方法CV_INTER_NN
CV_INTER_CUBIC 双三次插值
CV_INTER_LANCZOS4 8×8的Lanczos插入方法
CV_INTER_LINEAR双线性插值(默认方法)
CV_INTER_AREA 像素面积相关重采样。当缩小图像时,该方法可以避免波纹的出现。当放大图像时,类似于方法CV_INTER_NN
CV_INTER_CUBIC 双三次插值
CV_INTER_LANCZOS4 8×8的Lanczos插入方法