2008年6月18日 星期三

GUI介面的製作-AVI檔案開啟

AVI檔製作完了,接著就是將製作出來的AVI檔作播放的動作啦.播放AVI檔的程式碼如下:

AVI播放檔案程式碼
#include <cv.h>
#include <highgui.h>
#include <stdio.h>

int main()
{
    CvCapture *capture;
    IplImage *frame;
    char AviFileName[]="Output.avi";
    capture = cvCaptureFromAVI(AviFileName);
    cvNamedWindow("AVI player",0);

    while(true)
    {
        if(cvGrabFrame(capture))
        {
            frame=cvRetrieveFrame(capture);
            cvShowImage("AVI player",frame);

            if(cvWaitKey(10)>=0) break;
        }
        else
        {
            break;
        }
    }
    cvReleaseCapture(&capture);
    cvDestroyWindow("AVI player");
}

執行結果:


用cvCaptureFromAVI()播放AVI的檔案,再開個視窗介面show出來,就是這麼簡單,其中cvGrabFrame()跟cvRetrieveFrame()其實就是cvQueryFrame()的組合,直接用cvQueryFrame()也行,在這邊,當檔案播放玩的時候cvGrabFrame()會自動回傳0而while迴圈就會被break,如果沒撥放完會回傳1,而他就會繼續執行撥放相關的動作,當在GUI介面按任意鍵,就會跳出while迴圈而結束播放.再將資料結構的記憶體清空.

cvCaptureFromAVI()
這邊是用來播放AVI相關檔案,不過,它被OpenCV定義為

#define cvCaptureFromAVI cvCaptureFromFile
#define cvCaptureFromFile cvCreateFileCapture


所以用cvCaptureFromAVI()跟cvCaptureFromFile(),cvCreateFileCapture()其實都是一樣的東西.這邊其實副檔名不限avi檔,只要檔案格式符合OpenCV播放程式內建格式的標準就行.
cvCaptureFromAVI("AVI檔案名稱");

cvGrabFrame()
將capture抓下來的圖片放在OpenCV的快取,OpenCV描述是說用他們專用的壓縮格式放在它們的快取之中.同樣的,cvQueryFrame()也是相同的步驟,cvGrabFrame()回傳的數值是0跟1,0是失敗,1是成功.
int cvGrabFrame(CvCapture資料結構);

cvRetrieveFrame()
從快取中擷取Frame,並配置給IplImage資料結構.這邊cvQueryFrame()=cvGrabFrame()+cvRetrieveFrame().
cvRetrieveFrame(CvCapture資料結構);



7 意見:

匿名 提到...

你好,我用cvCaptureFromAVI()怎么打不开avi文件呢?

yester 提到...

有可能是檔案格式的問題喔...

如果是用OpenCV內部提供的AVI檔錄製應該是沒有這個問題

之前我用網路上的flv檔播放也是會失敗..

coolwaterld 提到...

hi,打不开avi文件,主要和解码器有关,可从http://www.xvidmovies.com/codec/ 下载XviD codec,并安装。然后就可以用cvCreateFileCapture打开XviD编码的视频文件

yester 提到...

謝謝您^^

Aaron 提到...

先進您好:
拜讀您的OPENCV網站讓我受益良多,也激起我深入鑽研的熱情。在此想請教您一些關於此演算法程式的相關細節:

1.請問在讀取AVI檔案後,要做兩張畫面相減,但是我該怎做呢能否告知?我不知道如何在影片裡抓取我要的圖片來存檔和相減。是要用到哪些指令呢?OPENCV英文版的是用這些指令,但是我還沒做出來。
Frame Differencing: cvAbsDiff(
frameTime1,
frameTime2,
frameForeground
);

carl3104 提到...

大大您好,向您請教問題,我播放AVI文件的時候,都會在還沒有播放完的時候就程式就自動結束,而跳出的時間隨影片的尺寸而異,無論原始影片有多長,720*480的影片大概播放到半分鐘會自動結束,320*240的影片大概播放兩分半鐘就會自動結束,請問這是哪裡的問題呢? 十分感謝。

david5192003 提到...

謝謝你的文章 讓我受益良多
想請問你
OpenCV播放程式內建格式
要怎麼查
因為我想知道它還能開啟哪些檔案

謝謝

Copyright 2008-2009,yester