【轉】OpenCV讀取MP4,mpeg, wmv, flv, mov, 3gp etc. on Win32



來源:http://wsyjwps1983.blog.163.com/blog/static/6800900120123181500785/
  

fily的日誌 - 網易博客


2012-04-18 13:50:00|  分類: 圖像與視頻編解碼|字號 訂閱

2011-09-25 14:41:56|  分類: 模式識別 |  標籤:

1、方法1
CFileDialog dlg(TRUE, _T("*.mp4"), NULL,OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY,_T("video files (*.avi) |*.avi|All Files (*.*)|*.*||"),NULL);

CString path ;

dlg.m_ofn.lpstrTitle= _T("OpenVedio");

if (dlg.DoModal() == IDOK) {

path = dlg.GetPathName(); 
}else
return;
IplImage* m_pFrame = NULL; // Declare IPL/OpenCV image pointer

HRESULT hr;
// 定義IMediaDet接口實例
CComPtr< IMediaDet > pDet;

hr = pDet.CoCreateInstance(__uuidof(MediaDet));
if (FAILED(hr))
return;

// 將影片文件名轉換成BSTR類型
CComBSTR openBSTR(path);
// 設置IMediaDet接口的文件關聯
hr = pDet->put_Filename(openBSTR);
if (FAILED(hr))
return ;

// 從影片中檢索視頻流和音頻流
long lStreams;
hr = pDet->get_OutputStreams(&lStreams);
if (FAILED(hr))
return ;

// 取出影片的視頻流,因爲幀的信息是保存在視頻流中的
bool bFound = false;
for (int i=0; i<lStreams; i++)
{
GUID major_type;
hr = pDet->put_CurrentStream(i);
if (SUCCEEDED(hr))
hr = pDet->get_StreamType(&major_type);
if (FAILED(hr))
break;
if (major_type == MEDIATYPE_Video)
{
bFound = true;
break;
}
}
if (!bFound)
return ;

long width = 0, height = 0; // 存儲位圖的寬和高(單位:象素)
AM_MEDIA_TYPE mt;
hr = pDet->get_StreamMediaType(&mt);
if (SUCCEEDED(hr))
{
if ((mt.formattype == FORMAT_VideoInfo) && (mt.cbFormat >= sizeof(VIDEOINFOHEADER)))
{
// 得到VIDEOINFOHEADER結構指針,VIDEOINFOHEADER結構包含一些與視頻
// 有關的信息,其中含有BITMAPINFORHEADER結構
VIDEOINFOHEADER *pVih = (VIDEOINFOHEADER*)(mt.pbFormat);
width = pVih->bmiHeader.biWidth;
height = pVih->bmiHeader.biHeight;
if(height < 0 ) height *= -1;
}
else
hr = VFW_E_INVALIDMEDIATYPE;
if(mt.cbFormat != 0)
{
CoTaskMemFree((PVOID)mt.pbFormat); 
mt.cbFormat = 0;
}

if (mt.pUnk != NULL)
{
mt.pUnk->Release();
mt.pUnk = NULL;
}

}
if (FAILED(hr))
return ;

long size;
double time = 0.0;
double totaltime;

double rate ;

// 獲取整個視頻的時間長度
pDet->get_StreamLength(&totaltime);
//每秒多少幀
pDet->get_FrameRate(&rate);

cvNamedWindow( "result", 1 );

//totaltime = totaltime*rate;
m_pFrame = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3);
//每秒讀一幀
for(time=0.0; time <totaltime; time+= 1.0) 
{
/*
hr = pDet->EnterBitmapGrabMode(time); 
if(FAILED(hr)) 

printf( "Failed in EnterBitmapGrabMode! hr=0x%x\r\n", hr ); 
return ; 



CComPtr < ISampleGrabber > pGrabber = NULL;
hr = pDet->GetSampleGrabber(&pGrabber);

pGrabber->GetCurrentBuffer(&size, NULL);
long m_nBufferSize = size;
pGrabber->GetCurrentBuffer(&m_nBufferSize, (long*)m_pFrame->imageData);
*/
///*
hr = pDet->GetBitmapBits(time, &size, 0, width, height);

if (FAILED(hr))
return ;

char *pBuffer = new char[size];
if (!pBuffer)
return ;
hr = pDet->GetBitmapBits(time, 0, pBuffer, width, height);
if (FAILED(hr))
return ;

m_pFrame->imageData = pBuffer + sizeof(BITMAPINFOHEADER);
//*/
cvFlip(m_pFrame);
//detect_and_draw(m_pFrame);
cvShowImage( "result", m_pFrame );
cvWaitKey( 10 );
delete[] pBuffer;
//AfxMessageBox("t");

}
cvReleaseImage(&m_pFrame);
cvDestroyWindow("result");

2 方法:
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include "ffopencv.h"


int main(int argc, char* argv[])
{
    
    IplImage *frame=NULL;
   
   CvCapture* capture; 
   capture=cvCaptureFromFile_FFMPEG("lake.mpg");//D:\\Downloads\\Guns and roses\\Guns N'Roses-Welcome To The Jungle.mpg");
//   capture=cvCreateFileCapture("lake.mpg");
//   CvSize imgSize;


   cvNamedWindow("videoS",CV_WINDOW_AUTOSIZE);  
   //   cvResizeWindow("video1",110,1000);
   cvMoveWindow( "videoS", 10, 50 );  //原始圖像窗口定位

   frame=cvQueryFrame(capture);   
   int numTotal=100000;
    for(int num=1;num<numTotal;num++)
   {
   

         frame=cvQueryFrame(capture);   
      cvShowImage("videoS", frame); 
      cvWaitKey(100);
   }

   return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章