2013-02-12 110 views
6

Tôi có video engine2.avi mà tôi muốn đọc và hiển thị với openCV. Dưới đây là mã của tôi:Đọc video với 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); 
} 

Mã này không hoạt động nếu tập tin của tôi có các codec YUV 4:2:2 (UYVY) (tôi ghi lại các video sử dụng trực tiếp Show), nhưng hoạt động khi tôi sử dụng một đoạn video tôi nắm lấy OpenCV whit !!

Có ai là ý tưởng về cách thức hoạt động của tính năng này không?

UPDATE:

Sau khi đọc một số liên kết, cho thấy bắt ngoại lệ sẽ giải quyết được vấn đề, tôi sửa đổi mã của tôi. Nó không hữu ích, nhưng đây là mã đã sửa đổi:

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

Chương trình bị treo trong cap>>frame. Tôi đã đọc các câu hỏi tương tự nhưng họ sử dụng khung trong YUV (4: 2: 0), trong khi video của tôi có UYVY (4: 2: 2). Làm thế nào tôi có thể chuyển đổi điều này thành mô hình màu RGB?

UPDATE 2:

Sau gợi ý karlphillip, tôi sử dụng OpenCV2.4.3, nhưng tôi vẫn có những lỗi tương tự bằng cách sử dụng mã bên dưới:

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

Trả lời

6

Dưới đây là một vài liên kết mà có thể giúp bạn:

Sửa:

tôi phải xóa một cái gì đó đầu tiên: OpenCV có khả năng đọc khung YUV từ một file video bởi vì đó là thư viện cơ bản (FFmpeg/GStreamer) mà không công việc. OpenCV cũng hỗ trợ chuyển đổi giữa một loại cụ thể của YUV and RGB đến cvCvtColor() với CV_YCrCb2RGB hoặc CV_RGBYCrCb.

Sau khi kiểm tra lại câu hỏi của bạn, tôi nhận thấy bạn đã không chỉ định loại lỗi xảy ra. Bạn có thể do a better job tại dealing với possiblefailure từ giao diện chụp bằng cách in thư đến màn hình thay vì throw.

Tôi đã thử nghiệm các tập tin video mà bạn chia sẻ và tôi không có vấn đề gì khi nó trên một cửa sổ bằng cách sử dụng đoạn mã sau:

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

Nếu vì một lý do nào, giao diện chụp thất bại trong việc mở file nó sẽ bỏ ứng dụng ngay lập tức, thay vì đi xa hơn chỉ để va chạm ở số cap.read(frame).

+0

cảm ơn @karlphilip cho câu trả lời của bạn. Nhưng trong những liên kết đó, họ giải thích cách chuyển đổi một khung hình trong YUV 4: 2: 2 thành RGB, tôi có một video khi tôi cố gắng lấy một khung hình từ đó toàn bộ chương trình bị lỗi !! – Engine

+0

Tải video lên một nơi nào đó và để chúng tôi thử nghiệm. – karlphillip

+0

1 GB cho 10s – Engine

0

Nếu bạn chỉ đang tìm kiếm để hiển thị video, đây là mã đã hoạt động với tôi, Vui lòng kiểm tra xem nó có giúp bạn bằng bất kỳ cách nào không.

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

Hy vọng điều này sẽ giúp bạn.

+0

mã này chỉ đọc một video là vấn đề của tôi, codec là vấn đề! Nhưng dù gì cũng cảm ơn ! – Engine

+0

Nếu sự cố xảy ra với codec và nếu bạn vẫn gặp sự cố, hãy đảm bảo bạn đã cài đặt codec ffmpeg. [Kiểm tra liên kết này để cài đặt ffmpeg] (http://www.wikihow.com/Install-FFmpeg-on-Windows). – Mayur

-1

Tôi nhận ra rằng, đối tượng VideoCapture cần opencv_ffmpeg310_64.dll. Khi bạn sao chép tệp dll này vào thư mục nhị phân, đối tượng VideoCapture của bạn sẽ có thể đọc tệp video.

Các vấn đề liên quan