阅读与OpenCV的视频(Reading a video with openCV)

2019-07-19 18:14发布

我有我想要阅读和OpenCV的显示视频engine2.avi。 这里是我的代码:

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

如果我的文件中有编解码器此代码不起作用YUV 4:2:2 (UYVY)我使用记录直接查看视频),但是当我使用的视频我抓住丝毫的OpenCV的作品!

有没有人一个想法如何这可能是工作?

更新:

读了一些链接,提示醒目异常将解决这个问题后,我修改了代码。 它并没有帮助,但这里是修改后的代码:

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 。 我readed类似的问题,但他们使用的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;
}

Answer 1:

下面是几个环节,可以帮助你:

  • 加载,保存和显示YUV 420个图像
  • 如何读取从YUV文件中OpenCV的框架?
  • YUV转换成BGR或RGB OpenCV中

编辑

我首先要明确的东西:OpenCV的是能够从视频文件中读取YUV帧 ,因为它的基础库(FFmpeg的/ GStreamer的),没有工作。 OpenCV的也支持特定类型的之间的转换YUV和RGB通过cvCvtColor()CV_YCrCb2RGBCV_RGBYCrCb

经再次检查你的问题,我注意到你没有指定所发生错误的类型。 你可以做一个更好的工作,在处理与可能的 故障通过打印一个消息到屏幕上,而不是从捕获接口throw荷兰国际集团它。

我测试您共享的视频文件,我没有问题玩它使用下面的代码窗口:

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



Answer 2:

如果你只是看着窗外,用于显示视频,在这里是为我工作的代码,请检查它可以帮助你以任何方式。

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

希望这可以帮助你。



Answer 3:

我意识到,在VideoCapture对象需要opencv_ffmpeg310_64.dll。 一旦你在你的二进制文件夹中复制此DLL您VideoCapture对象应该是能够读取视频文件。



文章来源: Reading a video with openCV