2013-02-12 11 views
6

Ich habe ein Video engine2.avi das ich mit openCV lesen und anzeigen möchte. Hier ist mein Code:Ein Video mit openCV lesen

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

Dieser Code funktioniert nicht, wenn meine Datei den Codec hat YUV 4:2:2 (UYVY) (I aufgezeichnet das Video Direktshow mit), aber funktioniert, wenn ich ein Video verwende ich Whit OpenCV packte !!

Hat jemand eine Idee, wie das funktionieren könnte?

UPDATE:

Nach ein paar Links zu lesen, was darauf hindeutet, dass Ausnahme abfangen wird das Problem lösen, modifizierte ich meinen Code. Es half nicht, aber hier ist der modifizierte Code:

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

Das Programm stürzt ab, in cap>>frame. Ich habe ähnliche Fragen gelesen, aber sie verwenden einen Frame in YUV (4: 2: 0), während mein Video UYVY (4: 2: 2) hat. Wie kann ich das in ein RGB-Farbmodell umwandeln?

UPDATE 2:

Nach karlphillip Vorschlag, habe ich OpenCV2.4.3, aber ich habe immer noch den gleichen Fehler mit dem Code unten:

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

Antwort

6

Hier ein paar Links ist das könnte helfen Ihnen:

bearbeiten:

ich etwas löschen muss zuerst: OpenCV ist YUV Frames aus einer Videodatei lesen kann, weil es die zugrunde liegende Bibliothek (FFmpeg/GStreamer) ist, das tut die Arbeit. OpenCV unterstützt auch die Konvertierung zwischen einem bestimmten Typ von YUV and RGB bis cvCvtColor() mit CV_YCrCb2RGB oder CV_RGBYCrCb.

Nachdem ich Ihre Frage erneut untersucht hatte, bemerkte ich, dass Sie die Art des aufgetretenen Fehlers nicht angegeben haben. Sie könnten do a better job bei dealing mit einem possiblefailure von der Capture-Schnittstelle durch Drucken einer Nachricht auf dem Bildschirm anstelle von throw ing es.

Getestet habe ich die Videodatei geteilt und ich hatte keine Probleme, die es in einem Fenster mit dem folgenden Code zu spielen:

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

Wenn aus irgendeinem Grunde die Capture-Schnittstelle, um die Datei zu öffnen, scheitert es verlassen wird die Anwendung sofort, anstatt weiter zu gehen nur um bei cap.read(frame) abstürzen.

+0

danke @ Karlphilip für Ihre Antwort. Aber in diesen Links erklären sie, wie man einen Frame, der in YUV 4: 2: 2 ist, in RGB konvertiert, ich habe ein Video, wenn ich versuche, einen Frame daraus zu bekommen, das ganze Programm stürzt ab !! – Engine

+0

Lade das Video irgendwo hoch und lass es uns testen. – karlphillip

+0

es ist 1 GB für 10s – Engine

0

Wenn Sie nur nach der Anzeige des Videos suchen, hier ist der Code, der für mich arbeitete, Bitte überprüfen Sie, ob es Ihnen in irgendeiner Weise hilft.

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

Hoffnung, dies hilft Ihnen.

+0

dieser Code lesen Sie nur ein Video, das war mein Problem, der Codec war das Problem! Danke trotzdem ! – Engine

+0

Wenn das Problem beim Codec aufgetreten ist und Sie weiterhin Probleme haben, stellen Sie sicher, dass Sie den ffmpeg-Codec installieren. [Überprüfen Sie diesen Link für die Installation von ffmpeg] (http://www.wikihow.com/Install-FFmpeg-on-Windows). – Mayur

-1

Ich erkannte, dass das VideoCapture-Objekt opencv_ffmpeg310_64.dll benötigt. Sobald Sie diese DLL in Ihren Binärordner kopieren, sollte Ihr VideoCapture-Objekt die Videodatei lesen können.