OpenCV学习笔记02--利用滚动条控制视频;高斯滤波处理图像。

例三:利用滚动条控制视频

新加入的函数:

1.cvSetCaptureProperty(g_capture, CV_CAP_PROP_POS_FRAMES, pos);   

  如果滚动条移动,就设置视频到对应的位置

2.cvGetCaptureProperty(g_capture, CV_CAP_PROP_FRAME_COUNT);    

  得到视频的帧数

3.cvCreateTrackbar("track1", "test", &g_slideposition, frames, onTrackbarSlide);   

  创建滚动条

4.cvSetTrackbarPos("track1", "test", cur_frame);         

  将滚动条设置到帧数对应的位置

首先,是要和例二一样,创建窗口,加载视频,截取一帧画面,显示图片。

然后,得到视频的总帧数,并创建滚动条。滚动条的回调函数将设置视频到滚动条对应的位置。

最后,如果要使滚动条根据视频的进度改变位置,应在每一次截取到图像之后,得到图像对应的帧数,然后设置滚动条到对应的位置。

但是这样会有一个问题,回调函数使每次滑动条位置改变时视频的进度也会改变,于是我们需要在回调函数中加以判断,如果视频的进度和我们得到的帧数相同时不再改变视频的进度。

PS:创建滚动条后,滚动条滑块的位置和value变量就绑定在了一起,在本例程中,value的值为g_slideposition

</pre><p><pre name="code" class="cpp">#include "stdafx.h"
#include "highgui.h"


CvCapture* g_capture;
int g_slideposition;
int cur_frame;
void onTrackbarSlide(int pos)
{
	if (pos != cur_frame){
		cvSetCaptureProperty(g_capture, CV_CAP_PROP_POS_FRAMES, pos);    //如果滚动条移动,就设置视频到对应的位置
	}
}
int main(int argc, char** argv)
{
	cvNamedWindow("test", 0);
	g_capture = cvCreateFileCapture("D:\\1.wmv"); 
	int frames=(int)cvGetCaptureProperty(g_capture, CV_CAP_PROP_FRAME_COUNT);    //得到视频的帧数
	if (frames != 0){
	cvCreateTrackbar("track1", "test", &g_slideposition, frames, onTrackbarSlide);   //创建滚动条
	}
	while (1)
	{
		IplImage* frame = cvQueryFrame(g_capture);
	cur_frame=(int)cvGetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES);   //得到视频当前帧的帧数
		cvSetTrackbarPos("track1", "test", cur_frame);         //将滚动条设置到帧数对应的位置
		if (!frame) break;
		cvShowImage("test", frame);
		int c = cvWaitKey(33);
		if (c == 27) break;
	}
	cvReleaseCapture(&g_capture);
	cvDestroyWindow("test");
	return 0;
}

例四:对图像进行简单的处理

新加入的函数:

1.IplImage* out = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3)

  创建深度为8位无符号整型通道数为3的图像结构空间来保存处理后的图像

2.cvSmooth(img, out, CV_GAUSSIAN, 3, 3)

  对每个像素周围3*3区域进行高斯滤波处理

对图像进行处理对应的函数在cv.h头文件里,所以需要包含cv.h头文件

1.首先是一个简单的显示图像的程序

2.然后我们需要创建一个结构空间来保存我们处理过的图像。这里要用到cvCreateImage(size,depth,channel);  size设置成和原图像一致所以直接用cvGetSize(img)获得原图像的大小,深度(depth)设置为8为无符号整形即IPL_DEPTH_8U,通道数(channel)3

3.最后对图像用cvSmooth进行高斯滤波处理,使其变得平滑。cvSmoothimg, out, CV_GAUSSIAN, 3, 3),参数分别为输入图像的指针,输出图像的指针,进行处理的区域。

#include "stdafx.h"
#include "highgui.h"
#include "cv.h"      //与图像转换有关的函数在cv.h头文件里
 
 
int _tmain(int argc, char** argv)
{
IplImage* img = cvLoadImage("D:\\2.JPG");
//	IplImage* img = cvLoadImage(argv[1]);
IplImage* out = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3);//创建深度为8位无符号整型,通道数为3的图像结构空间来保存处理后的图像
cvNamedWindow("Example", 0);
cvSmooth(img, out, CV_GAUSSIAN, 3, 3);  //对每个像素周围3*3区域进行高斯滤波处理
cvShowImage("Example", out);   
cvWaitKey(0);            
cvReleaseImage(&img);     
cvDestroyWindow("Example");  
while (1);
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值