看程序学OpenCV(2)
http://hi.baidu.com/ihsauqaxblbdmwq/item/a31f022c5f1e200f77272c66
3、创建滑动条
===============================================================
#include
#include
#include
int g_slider_position=0;//整型全局变量,用来传递滑动条的值
CvCapture *g_capture=NULL;//全局变量,用来传递AVI视频的CvCapture*类型结构体
void onTrackbarSlide(int pos)//滑动条滑动到新位置后,调用的响应函数
{
//用cvSetCaptureProperty函数来设置视频播放的位置,也就是当前的帧数
cvSetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES,pos);
}
int main(int argc, char** argv)
{
//用cvNamedWindow来创建一个名为Example3的窗口,窗口大小随显示图片的大小而改变
cvNamedWindow("Example3",CV_WINDOW_AUTOSIZE);
//用cvCreateFileCapture函数来将AVI视频文件读入内存中,并将其内存地址返回到一个
//CvCapture*类型变量里面,CvCapture*中含有其他的视频信息,可通过cvGetCaptureProperty获得
g_capture=cvCreateFileCapture(argv[1]);
//用cvGetCaptureProperty函数来从CvCapture*中获得视频总的帧数
int frames=(int)cvGetCaptureProperty(g_capture,CV_CAP_PROP_FRAME_COUNT);
//如果视频不为空
if(frames!=0)
{
//用cvCreateTrackbar函数来在窗口Example3上创建一个名为Position的滑动条,滑动条的
//值保存到g_slider_position中,滑动条的滑动范围为从0到frames,滑动条的响应函数为
//onTrackbarSlider,该响应函数的参数必须为一个整型的变量,且不能有其他参数
cvCreateTrackbar("Position","Example3",&g_slider_position,frames,onTrackbarSlide);
}
IplImage *frame;
//用cvQueryFrame函数从CvCapture*中获得一帧图像
while((frame=cvQueryFrame(g_capture))!=NULL)
{
char c=cvWaitKey(33);//程序等待33毫秒,将按键的ASCII值返回到c中
if(c==27) break;//如果按下的是Esc键,就退出循环,即停止播放AVI视频
cvShowImage("Example3",frame);//用cvShowImage函数在窗口Example3中显示读入的帧的图像
}
//用cvReleaseCapture函数释放CvCapture*所占的内存空间
cvReleaseCapture(&g_capture);
//用cvDestroyWindow函数来销毁名为Example3的窗口
cvDestroyWindow("Example3");
//程序结束,返回0
return 0;
}
需要记住:
1、创建滑动条时,需要一个全局变量来传递滑动条的值
2、滑动条的响应函数的名字可以随意,但是参数只能为一个整型变量
3、cvSetCaptureProperty函数可以用来设置AVI视频文件的属性,比如控制当前的帧数,可以设置的标识符有:
CV_CAP_PROP_POS_MSEC - 从文件开始的位置,单位为毫秒
CV_CAP_PROP_POS_FRAMES - 单位为帧数的位置(只对视频文件有效)
CV_CAP_PROP_POS_AVI_RATIO - 视频文件的相对位置(0 - 影片的开始,1 - 影片的结尾)
CV_CAP_PROP_FRAME_WIDTH - 视频流的帧宽度(只对摄像头有效)
CV_CAP_PROP_FRAME_HEIGHT - 视频流的帧高度(只对摄像头有效)
CV_CAP_PROP_FPS - 帧率(只对摄像头有效)
CV_CAP_PROP_FOURCC - 表示codec的四个字符(只对摄像头有效)
4、cvGetCaptureProperty函数可以用来获得AVI视频文件的某个属性,可以获得的属性有:
CV_CAP_PROP_POS_MSEC - 影片目前位置,为毫秒数或者视频获取时间戳
CV_CAP_PROP_POS_FRAMES - 将被下一步解压/获取的帧索引,以0为起点
CV_CAP_PROP_POS_AVI_RATIO - 视频文件的相对位置(0 - 影片的开始,1 - 影片的结尾)
CV_CAP_PROP_FRAME_WIDTH - 视频流中的帧宽度
CV_CAP_PROP_FRAME_HEIGHT - 视频流中的帧高度
CV_CAP_PROP_FPS - 帧率
CV_CAP_PROP_FOURCC - 表示codec的四个字符
CV_CAP_PROP_FRAME_COUNT - 视频文件中帧的总数
5、cvCreateTrackbar函数可以用来在某个窗口上创建一个滑动条,其参数依次为:滑动条的名称,窗口名,滑动条的值存储
在那个变量里面,滑动条滑动的最大值,滑动条的响应函数
4、平滑一副图像
=================================================================
#include
#include
void example2_4(IplImage *image)
{
//用cvNamedWindow函数创建一个名为Example4-in的窗口,其大小随显示图片而改变
cvNamedWindow("Example4-in");
//用cvNamedWindow函数创建一个名为Example4-out的窗口,其大小随显示图片而改变
cvNamedWindow("Example4-out");
//用cvShowImage在窗口Example4-in中显示图片image
cvShowImage("Example4-in",image);
//用cvCreateImage函数来创建一副图片,其大小和image的大小一致,每个通道为8位
//无符号整数,也就是说每个通道的值的范围为0-255,程序中创建的是3个通道的图片
//也就是说如果是24位的RGB位图,那么R占一个通道,G占一个通道,B占一个通道
IplImage *out=cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,3);
//用cvSmooth函数来平滑图片,源图片为image,目的图片为out,使用的是CV_GAUSSIAN
//平滑,模板大小为3*3
cvSmooth(image,out,CV_GAUSSIAN,3,3);
//用cvShowImage函数在窗口Example4-out中显示图片out
cvShowImage("Example4-out",out);
//用cvReleaseImage函数来释放图片out所占的空间
cvReleaseImage(&out);
//程序等待直到有键盘响应
cvWaitKey(0);
//销毁窗口Example4-in
cvDestroyWindow("Example4-in");
//销毁窗口Example4-out
cvDestroyWindow("Example4-out");
}
int main(int argc, char* argv[])
{
if(argc!=2) return -1;
if(!img) return -1;
return 0;
}
需要记住:
1、用cvCreateImage函数来创建一个图片,其返回类型为IplImage*类型
函数声明为:IplImage* cvCreateImage( CvSize size, int depth, int channels );
2、用cvGetSize函数来获得一个图片的大小,返回类型为CvSize类型
函数声明为:CvSize cvGetSize( const CvArr* arr );
3、用cvSmooth函数来平滑一个图片,可使用的平滑方法有:
CV_BLUR_NO_SCALE (简单不带尺度变换的模糊) - 对每个象素的 param1×param2 领域求和。如果邻域大小是变化的,可以事先利用函数 cvIntegral 计算积分图像。
CV_BLUR (simple blur) - 对每个象素param1×param2邻域 求和并做尺度变换 1/(param1?param2).
CV_GAUSSIAN (gaussian blur) - 对图像进行核大小为 param1×param2 的高斯卷积
CV_MEDIAN (median blur) - 对图像进行核大小为param1×param1 的中值滤波 (i.e. 邻域是方的).
CV_BILATERAL (双向滤波) - 应用双向 3x3 滤波,彩色 sigma=param1,空间 sigma=param2.
函数声明为:void cvSmooth( const CvArr* src, CvArr* dst,int smoothtype=CV_GAUSSIAN,
int param1=3, int param2=0, double param3=0, double param4=0 );