opencv学习3

来源:互联网 发布:弱肉强食知乎 编辑:程序博客网 时间:2024/06/05 20:58
动态调整窗口大小并进行灰度变换
代码如下:
#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;//加载aviavi=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
原创粉丝点击