OpenCV入門系列(4):顯示一張圖片和一個視頻


顯示一張圖片,對於我們來說是很容易理解的事情。但播放一個視頻,感覺就很神秘很有技術含量了。

然而今天看了《學習OpenCV中文版》中的兩個小例子后,驚呼,原來如此,居然這么簡單!就是我們經常所說的電影動畫原理:視覺殘留。先從視頻文件中取出一幀(即一張圖片),顯示出來,暫停若干毫秒后,取下一張,再顯示出來,視頻就播放起來了。

《學習OpenCV中文版》真是本好書,強烈推薦。

顯示一張圖片

使用OpenCV讀取並顯示一張圖片。

核心代碼

核心代碼就這幾行:

#include "highgui.h"

char* imgPath = "logo.png";
IplImage* img = cvLoadImage(imgPath);
cvNamedWindow( "Example1", CV_WINDOW_AUTOSIZE);
cvShowImage("Example1", img);

首先通過cvLoadImage函數讀取一張圖片,然后創建一個窗口,再把img指針傳過去,就顯示出來了。

見效果:

image

完整代碼

下面是一個完整的示例,增加銷毀圖片、窗口等擦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就得到了它下一張圖片。反復去取,反復播放即可。

效果如下:

image

完整代碼

完整的代碼如下:

#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;
}

可以看出還是非常簡單的。

關於對視頻的進一步控制,如獲取文件實際幀率,跳到某一幀,前進后退等,等以后再寫。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM