OPENCV调用cvCreateFileCapture返回NULL
最近在c++使用视频处理项目,当capture = CvInvoke.cvCreateFileCapture(file)获取视频信息的时候,总返回空值NULL
相信大家也遇到过同样的问题,几番周折,我查找了一些资料,造成这种错误的原因有以下几点:
1.你看看自己工程里面是否添加了opencv_ffmpeg*.dll文件( *代表版本号如240,330,331)
我用的opencv3.3版本,解决方式:把opencv_ffmpeg330.dll,放在debug目录或者release下,
2.自己电脑是否装载了解码器
我认为大家遇到的此类问题的最大的可能性是第一种原因
opencv3:播放AVI格式视频
一、不带滚动条的视频读取播放。
1、原理介绍:视频的本质是一些静态的图像的集合,opencv可以不断读取视屏中的图片,显示,就可以实时的视频流进行处理了。
2、代码如下:
1 /***********************************************************************************
2 开发环境:opencv3.0.0 + vs2012旗舰版;win7正式版32位
3 功能描述:播放AVI格式视频
4 作者信息:博乐Bar
5 开发时间:20150922
6 ***********************************************************************************/
7 #include <opencv2/opencv.hpp>
8 using namespace cv;
9 using namespace std;
10
11 int main()
12 {
13 cvNamedWindow("AVI视频播放—博乐Bar");//创建一个窗口,固定大小不随图像改变
14 /**********
15 cvCreateFileCapture函数读取路径下的视频文件,把帧信息指针返回到CvCapture结构体指针中,
16 包含关于要读入的avi文件的状态信息此次调用返回avi视频文件的开头。
17 **********/
18 CvCapture * capture = cvCreateFileCapture("video.avi");
19 IplImage * frame;
20
21 //需要不断循环读取下一帧,因此需要while循环,只有当用户按键或者视频读取完毕时才跳出循环
22 while(1)
23 {
24 frame = cvQueryFrame(capture);//根据CvCapture指针提供的状态信息,抓取帧信息保存到IplImage指针里
25 if(!frame)break;
26 cvShowImage("AVI视频播放—博乐Bar",frame);
27 char c = cvWaitKey(33);//①控制帧率,控制视频播放的快慢;②接受键盘输入,返回值为该键盘对应的asiccII码
28 if(c==27) break; //十进制数27是键盘退出键Esc对应的asiccII码
29 }
30 //释放CvCapture指针的内存空间,同时关闭命名窗口
31 cvReleaseCapture(&capture);
32 cvDestroyWindow("AVI视频播放—博乐Bar");
33 return 0;
34 }
3、关于以上代码的几点说明:
①实现的功能:读取文件夹路径的视频,并且播放,播放速度粗略的控制用cvwaitkey函数;
②关于cvwaitkey函数:
函数原型:cvWaitKey(int delay)
cvWaitKey()函数的功能是是程序暂停,等待用户触发一个按键操作。但如果该函数参数设为一个正数,则程序将暂停一段时间,时间长为该整数值个毫秒单位,然后继续执行程序,即使用户没有按下任何键。
delay<=0时,函数cvWaitKey无限制的等待按键事件,所以显示图像时,需要在cvShowImage(“**.bmp”,image)后加上cvWaitKey(n)——n为小于等于0的数即可,程序停在显示函数处,不运行其他代码;否则,图像无法正常显示。
delay>0时,延迟”delay”ms,在显示视频时这个函数是有用的,用于设置在显示完一帧图像后程序等待”delay”ms再显示下一帧视频;如果使用cvWaitKey(0)则只会显示第一帧视频。
返回值:被按键的值,如果超过指定时间则返回-1。
如果程序想响应某个按键,可利用if(cvWaitKey(1)==Keyvalue);
二、带滚动条的AVI视频播放
1、代码如下:
1 /***********************************************************************************
2 开发环境:opencv3.0.0 + vs2012旗舰版;win7正式版32位
3 功能描述:播放AVI格式视频
4 作者信息:博乐Bar
5 开发时间:20150922
6 ***********************************************************************************/
7 #include <opencv2/opencv.hpp>
8
9 int g_slider_position = 0;
10 CvCapture * g_capture =NULL;
11
12 void onTrackbarSlide(int pos){ //再拖动滚动条的时候,滚动条的位置会被作为int数字传入
13 cvSetCaptureProperty(
14 g_capture,
15 CV_CAP_PROP_POS_FRAMES,
16 pos
17 );
18 }
19
20 int main(){
21 cvNamedWindow("AVI播放_博乐Bar",CV_WINDOW_AUTOSIZE);//申请可以自动调节大小的窗口Example1
22 g_capture=cvCreateFileCapture("video.avi");//读取avi格式的影片
23
24 int frames = (int) cvGetCaptureProperty(
25 g_capture,
26 CV_CAP_PROP_FRAME_COUNT
27 );
28
29 if(frames != 0){
30 cvCreateTrackbar( //进度条
31 "Position",
32 "AVI播放_博乐Bar",
33 &g_slider_position,
34 frames,
35 onTrackbarSlide
36 );
37 }
38
39 IplImage * frame;
40 while(1){
41 frame = cvQueryFrame(g_capture);//读取下一个影片帧率
42 if(!frame)break;
43 cvShowImage("AVI播放_博乐Bar",frame);
44 char c=cvWaitKey(33); //每读取一个视频片度就停止33毫秒,并且会收集键盘的输入
45 if(c == 27)break;//27就是对应键盘上的ESC建,如果没有按键盘的话C为-1
46 }
47
48 cvReleaseCapture(&g_capture);
49 cvDestroyWindow("AVI播放_博乐Bar");
50
51 return 0;
52 }
评论(0)
您还未登录,请登录后发表或查看评论