OpenCV的第二天,两个简单的视频处理程序,依旧伴着那Learning OpenCV一书和各种百度。
1.播放avi格式视频
#include "highgui.h"
#include "cv.h"void main() {
cvNamedWindow( "Example2", 0 );CvCapture* capture = cvCreateFileCapture( "火山.avi" );IplImage* frame;while(1) { frame = cvQueryFrame( capture );if( !frame ) break;cvShowImage( "Example2", frame );char c = cvWaitKey(33);if( c == 27 ) break;}cvReleaseCapture( &capture );cvDestroyWindow( "Example2" );}//display a video2.为视频播放窗口添加时间轴(以帧为单位)
#include "highgui.h"
#include "cv.h"int g_slider_position = 0;//g_表示全局变量
CvCapture* g_capture = NULL;void onTrackbarSlide(int pos)//用户拨动时间轴时使用的回调程序{ cvSetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES,pos);//CV_CAP_PROP_POS_FRAMES, which indicates that we would like to set the read position
//in units of frames. (We can use AVI_RATIO instead of FRAMES if we want to set the position //as a fraction of the overall video length)}int main() { cvNamedWindow( "Example3", CV_WINDOW_AUTOSIZE ); g_capture = cvCreateFileCapture( "火山.avi" ); int frames = (int) cvGetCaptureProperty(g_capture,CV_CAP_PROP_FRAME_COUNT); if( frames!= 0 ) { cvCreateTrackbar("Position","Example3",&g_slider_position,frames,onTrackbarSlide); }// While loop (as in Example 2) capture & show videoIplImage* frame; while(1) { frame=cvQueryFrame(g_capture);//从g_capture 获取一帧图像 if( !frame ) break; g_slider_position++;// cvShowImage( "Example3", frame ); char c = cvWaitKey(33); if(c==27)//27是Esc按键的ASCII值 break;//按下ESc键,停止播放 }cvReleaseCapture( &g_capture );cvDestroyWindow( "Example3" );// Release memory and destroy windowreturn(0);
}
以上两个程序需要指出的是:
(1)AVI格式的视频并非皆可播放。(有时会一闪)
---解决:下载解码器(博主亲测下载Xvid对某一avi文件无用,尚未弄清原因)
根据网络搜索的资料:
以AVI格式结尾的视频文件有好几种,不同种类对应的压缩方式是不一样的。这也就意味着,以AVI格式结尾的文件,随着压缩方式的不同,需要的解码器也是不同的。
① 非压缩格式的AVI文件(或者MPEG-1格式的文件),这个就不需要任何的插件就可以直接播放了。
② DIVX格式的AVI文件,安装最新版本的DIVX解码器就可以播放了。不过,正式版本的DIVX是要收费的,如果你用的是非正式版的,或者试用版的,估计可能会出现一些问题。
③ XVID格式的AVI文件,这是MPEG-4格式的一种,可以说是从DIVX变异而来的。XVID是一个免费的视频编解码器,你可以放心大胆的使用。
④ ffdshow MPEG-4格式的AVI文件,现在越来越多的AVI都采用ffdshow MPEG4来进行压缩编码,它集成了XVID和DIVX两者的优点。所以,如果你安装了ffdshow,那么就不用担心DIVX,XVID编码的解码了。另外,ffdshow还提供了丰富的滤镜功能,如增加亮度,增加锐度等。
⑤ WMV9格式的AVI文件,微软自己推出的MPEG4编码标准。使用Media Player 9.0就可以播放。
⑥ VP6格式的AVI文件,也是一种MPEG4的编码格式,On2 Technologies开发的编码器,VP6号称在同等码率下,视频质量超过了Media Player 9.0和H.264。VP6视频编码器目前被中国的EVD所采用,不过,除此之外,这种格式的编码的应用并不多见。
⑦ 其它格式的AVI文件。
正如前面所说,AVI只是一个外壳框架,并没有规定内部的解码必须采用什么标准。这就造成了同样是.avi结尾,但有的播放器能播放,有的却不能的现象经常发生。
(2)Learning OpenCV一书叫人无法偷懒
此书所有的代码都需要读者细心修改,才能编译连接通过。这令人头疼,但无疑使人进步,逼人思考。