2013-02-12 61 views
6

我有一個視頻engine2.avi我想閱讀並用openCV顯示。這裏是我的代碼:如果我的文件有編解碼器YUV 4:2:2 (UYVY)(我使用直接顯示錄製的視頻)用openCV讀取視頻

#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <iostream> 

using namespace cv; 

int main(int argc, char** argv) 
{ 
    string filename = "D:\\BMDvideos\\engine2.avi"; 
    VideoCapture capture(filename); 
    Mat frame; 

    if(!capture.isOpened()) 
     throw "Error when reading steam_avi"; 

    namedWindow("w", 1); 
    for(; ;) 
    { 
     capture >> frame; 
     //if(!frame) 
     // break; 
     imshow("w", frame); 
     waitKey(20); // waits to display frame 
    } 
    waitKey(0); 
} 

此代碼不能正常工作,但是當我使用的視頻我抓住絲毫的OpenCV的作品!

有沒有人有一個想法這可以如何工作?

UPDATE:

讀了一些鏈接,提示醒目異常將解決這個問題後,我修改了代碼。它並沒有幫助,但這裏是修改後的代碼:

cv::VideoCapture cap("d:\\BMDvideos\\engine2.avi"); 
cv::Mat frame; 

try 
{ 
    cap >> frame; 
} 
catch(cv::Exception ex) 
{ 
    std::cout << ex.what() << std::endl; 
} 
catch(...) 
{ 
    std::cout << "Unknown exception" << std::endl; 
} 

程序崩潰的cap>>frame。我回答了類似的問題,但他們在YUV(4:2:0)中使用了幀,而我的視頻具有UYVY(4:2:2)。我怎樣才能將其轉換成RGB顏色模型?

更新2:

karlphillip的建議後,我用OpenCV2.4.3,但我仍然使用下面的代碼得到了同樣的錯誤:

#include <opencv2\core\core.hpp> 
#include <opencv2\highgui\highgui.hpp> 
#include <opencv2\opencv.hpp> 
using namespace cv; 
using namespace std; 

int main(){ 
    cv::Mat frame; 
    cv::VideoCapture cap("d:\\BMDvideos\\B\\Aufnahme.avi"); 
    if(!cap.isOpened()) 
    { 
     cout << "Error can't find the file"<<endl; 
    } 

    while(1){ 
     if(!cap.read(frame)) 
      imshow("",frame); 

     cv::waitKey(33); 
    } 
    return 0; 
} 

回答

6

下面是幾個環節可能幫助您:

編輯

我首先要明確的東西:OpenCV的是能夠從視頻文件中讀取YUV幀,因爲它是做底層庫(FFmpeg的/ GStreamer的)工作。 OpenCV還支持在特定類型YUV and RGBcvCvtColor()CV_YCrCb2RGBCV_RGBYCrCb之間轉換。

再次檢查您的問題時,我注意到您沒有指定發生的那種錯誤。您可以通過將消息打印到屏幕而不是屏幕上的throw來從捕獲界面輸入do a better jobdealingpossiblefailure

我測試您共享的視頻文件,我沒有任何問題,使用下面的代碼打它一個窗口:

#include <cv.h> 
#include <highgui.h> 

#include <iostream> 

int main(int argc, char* argv[]) 
{ 
    cv::VideoCapture cap(argv[1]); 
    if (!cap.isOpened()) 
    { 
     std::cout << "!!! Failed to open file: " << argv[1] << std::endl; 
     return -1; 
    } 

    cv::Mat frame; 
    for(;;) 
    { 

     if (!cap.read(frame))    
      break; 

     cv::imshow("window", frame); 

     char key = cvWaitKey(10); 
     if (key == 27) // ESC 
      break; 
    } 

    return 0; 
} 

如果由於某種原因,捕獲界面無法打開,它會退出該文件應用程序立即,而不是進一步只是在cap.read(frame)崩潰。

+0

感謝@karlphilip爲您解答。但在這些鏈接中,他們解釋瞭如何將YUV 4:2:2中的幀轉換爲RGB,當我試圖從整個程序崩潰時獲取幀時,我有一個視頻! – Engine 2013-02-13 10:25:30

+0

上傳視頻的地方,讓我們測試它。 – karlphillip 2013-02-13 12:31:28

+0

它是10 GB的1 GB – Engine 2013-02-13 13:02:42

0

如果你只是看着窗外顯示的視頻,在這裏是爲我工作的代碼, 請檢查它可以幫助你以任何方式。

#include <stdio.h> 
#include <opencv2/opencv.hpp> 
int main(){ 
CvCapture *camera=cvCaptureFromFile("C:\\test.avi"); 
if (camera==NULL) 
    printf("camera is null\n"); 
else 
    printf("camera is not null"); 

cvNamedWindow("img"); 
while (cvWaitKey(10)!=atoi("q")){ 
    double t1=(double)cvGetTickCount(); 
    IplImage *img=cvQueryFrame(camera); 
    /*if(img){ 
     cvSaveImage("C:/opencv.jpg",img); 
    }*/ 
    double t2=(double)cvGetTickCount(); 
    printf("time: %gms fps: %.2g\n",(t2-t1)/(cvGetTickFrequency()*1000.), 1000./((t2-t1)/(cvGetTickFrequency()*1000.))); 
    cvShowImage("img",img); 
} 
cvReleaseCapture(&camera); 
} 

希望這可以幫助你。

+0

這段代碼只是讀了一個視頻,這是我的問題,編解碼器是問題!不過謝謝! – Engine 2013-12-18 13:58:01

+0

如果問題出在編解碼器上,並且您仍然面臨問題,請確保安裝ffmpeg編解碼器。 [檢查此鏈接以安裝ffmpeg](http://www.wikihow.com/Install-FFmpeg-on-Windows)。 – Mayur 2013-12-19 05:11:55

-1

我意識到,VideoCapture對象需要opencv_ffmpeg310_64.dll。 一旦你在你的二進制文件夾中複製這個DLL,你的VideoCapture對象應該能夠讀取視頻文件。