顯示一張圖片,對於我們來說是很容易理解的事情。但播放一個視頻,感覺就很神秘很有技術含量了。
然而今天看了《學習OpenCV中文版》中的兩個小例子后,驚呼,原來如此,居然這么簡單!就是我們經常所說的電影動畫原理:視覺殘留。先從視頻文件中取出一幀(即一張圖片),顯示出來,暫停若干毫秒后,取下一張,再顯示出來,視頻就播放起來了。
《學習OpenCV中文版》真是本好書,強烈推薦。
顯示一張圖片
使用OpenCV讀取並顯示一張圖片。
核心代碼
核心代碼就這幾行:
#include "highgui.h" char* imgPath = "logo.png"; IplImage* img = cvLoadImage(imgPath); cvNamedWindow( "Example1", CV_WINDOW_AUTOSIZE); cvShowImage("Example1", img);
首先通過cvLoadImage函數讀取一張圖片,然后創建一個窗口,再把img指針傳過去,就顯示出來了。
見效果:
完整代碼
下面是一個完整的示例,增加銷毀圖片、窗口等擦PP的操作:
#include "highgui.h" int main(int argc, char** argv) { char* imgPath = "logo.png"; IplImage* img = cvLoadImage(imgPath); cvNamedWindow( "Example1", CV_WINDOW_AUTOSIZE); cvShowImage("Example1", img); cvWaitKey(0); cvReleaseImage(&img); cvDestroyWindow("Example1"); return 0; }值得一提的是,cvLoadImage函數可識別多數常用的圖片格式,像png/bmp/jpg等,遺憾的是不識別gif(可能因為gif是多幀圖片)。
播放一個AVI視頻
OpenCV可以播放AVI格式的視頻,不過在我的電腦上只能播放一些特別簡單的,大一點的就會出錯,可能是缺少相應的解碼器。所以在測試下面的例子時,盡量找一些簡單的AVI視頻來試。
播放原理
如本文開頭所說,就是通過函數從視頻文件中取一幀幀的圖片,隔一小段時間顯示一張。當速度達到每秒24張左右時,就能形成流暢的動態效果。
通過OpenCV提供的函數從視頻文件中取幀圖片,再結合上例中顯示圖片的代碼,就可輕松搞定。
核心代碼
char* avi = "d:\\demo.avi"; CvCapture* capture = cvCreateFileCapture(avi); IplImage* frame = cvQueryFrame(capture);
通過cvCreteFileCapture處理avi文件,得到一個capture指針,再通過cvQueryFrame就得到了它下一張圖片。反復去取,反復播放即可。
效果如下:
完整代碼
完整的代碼如下:
#include "highgui.h" int main22(int argc, char** argv) { char* avi = "d:\\demo.avi"; cvNamedWindow ("Example2", CV_WINDOW_AUTOSIZE); 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"); return 0; }
可以看出還是非常簡單的。
關於對視頻的進一步控制,如獲取文件實際幀率,跳到某一幀,前進后退等,等以后再寫。