opencv学习3

动态调整窗口大小并进行灰度变换
代码如下:
#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));
参数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 


修改图片尺寸函数
CVAPI(void)  cvResize( const CvArr* src, CvArr* dst,
                       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插入方法


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值