例三:利用滚动条控制视频
新加入的函数:
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进行高斯滤波处理,使其变得平滑。cvSmooth(img, 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);
}