opencv学习笔记(二)

来源:互联网 发布:淘宝大额优惠券在哪 编辑:程序博客网 时间:2024/06/05 06:35

由于我是初学,其中可能会有很多术语描述错误,希望大家可以给予指正,菜鸟在此拜

谢!

1.读取avi视频(这是vc6.0+opencv1.0上调的代码)

#include<iostream>#include "cv.h"#include "highgui.h"using namespace std;int main(int argc,char ** argv){cvNamedWindow("Example2",CV_WINDOW_AUTOSIZE);//给一个窗口命名CvCapture* capture=cvCreateFileCapture("D:\\programefiles\\opencv\\sources\\samples\\c\\tree.avi");//cvCreateFileCapture()通过参数设置确定要读入的avi文件,返回一个指向CvCapture结构的指针if (!capture)//判断,如果没有读取到avi视频,退出{cout<<"unable to load a video"<<endl;    cvWaitKey(0);exit(0);}IplImage *frame;while(true){frame=cvQueryFrame(capture);//cvQueryFrame()从摄像头或者文件中抓取并返回一帧,视频获取结构。//个人理解就是把视频分化成一张张图片然后调用cvShowImage()函数播放出来,然后连续的一张张图片播放,不知道对不对if(!frame)break;cvShowImage("Example2",frame);char c=cvWaitKey(33);//每隔33ms载入一帧图像,cvWaitKey()函数的功能是不断刷新图像,频率时间为33,单位为ms,我看那个书上写的是33,我试了其他数字,发现也可以运行成功/*显示图像时:cvWaitKey(n)——n为小于等于0的数即可,程序停在显示函数处,不运行其他代码,所以我们在显示图像时可以看到cvWaitKey(0)或cvWaitKey(-1)显示视频时:n>0时,延迟"n"ms,用于设置在显示完一帧图像后程序等待"n"ms再显示下一帧视频;如果使用cvWaitKey(0)则只会显示第一帧视频。*/if(c==27)break;}cvReleaseCapture(&capture);//释放为CvCapture 结构开辟的内存空间cvDestroyWindow("Example2");//销毁窗口return 0;}

注意别把窗口名字写错了,我刚开始把
cvShowImage中的<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">Example2的E没大写,而前面命名窗口却是大写的,导致视频播放不了</span>

2.用来添加滚动条到基本浏览窗口的程序:拖动滚动条,函数 onTrackSlide()便被调用并被传入滚动条新的状态值(这是vs上调的)

#include "stdafx.h"#include<iostream>#include "opencv2/opencv.hpp"int g_slider_position=0;//定义全局变量,为了使程序可读性更强,变量名称前加上g_CvCapture* g_capture =NULL;void onTrackbarSlide(int pos){cvSetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES,pos);//设置视频获取属性//int cvSetCaptureProperty( CvCapture* capture, int property_id, double value );}int main(int argc,char ** argv){cvNamedWindow("Example3",CV_WINDOW_AUTOSIZE);g_capture=cvCreateFileCapture("E:\\code\\VC6.0\\AVI\\Wildlife_Xvid.avi");//cvCreateFileCapture 初始化从文件中获取视频int frames=(int)cvGetCaptureProperty(g_capture,CV_CAP_PROP_FRAME_COUNT);//cvGetCaptureProperty 获得视频获取结构的属性,/*书上用的是强制转换,我查opencv函数手册发现cvSetCaptureProperty()是int类型,而cvGetCaptureProperty却是double类型,这一点我比较纳闷,为什么不来一样的呢,后来我用double也试了一下,也可以运行处结果*///double frames=cvGetCaptureProperty(g_capture,CV_CAP_PROP_FRAME_COUNT);// //CV_CAP_PROP_FRAME_COUNT - 视频文件中帧的总数 if(frames!=0){cvCreateTrackbar("position","Example3",&g_slider_position,frames,onTrackbarSlide);//cvCreateTrackbar 创建trackbar并将它添加到指定的窗口}IplImage *frame;while(true){frame=cvQueryFrame(g_capture);//cvQueryFrame 从摄像头或者文件中抓取并返回一帧if(!frame)break;cvShowImage("Example3",frame);char c=cvWaitKey(33);//33msif(c==27)break;}cvReleaseCapture(&g_capture);//释放CvCapture结构 cvDestroyWindow("Example3");//销毁一个窗口return 0;}

运行结果发现一个问题,就是我如果鼠标移动那个播放视频的窗口,视频就会暂停播放,等我鼠标松开会继续播放,不知道为什么,大牛看到了希望可以给予解答!拜谢!

感觉自己代码的注释应该比较详细,可以看懂的,希望可以为以后新手学习opencv的同学提供帮助吧!



0 0
原创粉丝点击