使用OpenCV打开和读取avi文件 - Ubuntu

CTZ*_*tef 3 ubuntu opencv avi codec

我刚刚在R. Laganiere的"OpenCV 2计算机视觉应用程序设计手册"一书中读过这篇文章:

请务必注意,为了打开指定的视频文件,您的计算机必须安装相应的编解码器,否则cv :: VideoCapture将无法理解输入文件.通常情况下,如果您能够在计算机上使用视频播放器打开视频文件(例如Windows Media Player),那么OpenCV也应该能够读取此文件.

不幸的是,事情对我来说并不容易.是的,我可以在我的视频播放器上读取avi文件,但它不适用于我的OpenCV-Qt应用程序.VideoCapture isOpen()方法返回false,尽管路径是正确的,并且所需的每个编解码器似乎都在这里.我尝试了几个文件,因此它与一种特定格式无关.

这里有人有使用OpenCV在Ubuntu中打开avi文件的经验吗?我认为这是一个大问题,在互联网上找不到任何相关的解决方案......

谢谢 !!

[编辑]这是我正在努力的功能; 这里的一些变量是类成员,因此可能看起来不完整.但是,正是这段代码无法正常工作.特别是,我实例化一个新的VideoCapture对象的行.

void MainWindow::on_actionOuvrir_fichier_triggered()
{
    //mettre a -1 streamId
    streamId = -1;
    //get path to the avi file
    QString fileName = QFileDialog::getOpenFileName(this,tr("Ouvrir fichier video"),"/home", tr("Videos (*.avi)"));
    std::string utf8_text = fileName.toUtf8().constData();
    //open .avi
    capture = new VideoCapture(utf8_text);
    //check 
    if(!capture->isOpened())
        cout << "probleme ouverture fichier video" << endl;
    //delay between each frame in ms
    rate = capture->get(CV_CAP_PROP_FPS);
    delay = 1000 / rate;
    //start Qtimer recordId
    recordId = startTimer(delay);
    //capture first frame
    if(!capture->read(in))
        cout << "probleme lecture frame fichier video" << endl;
}
Run Code Online (Sandbox Code Playgroud)

在Windows 7上进行[编辑2]测试

void MainWindow::on_actionOuvrir_fichier_triggered()
{
    //mettre a -1 streamId
    streamId = -1;
    //ouvrir fenetre navigation fichiers pour recuperer path vers .avi
    QString fileName = QFileDialog::getOpenFileName(this,tr("Ouvrir fichier video"),"/home",
                                                    tr("Videos (*.avi)"));
    //std::string utf8_text = fileName.toUtf8().constData();
    std::string current_locale_text = fileName.toLocal8Bit().constData();
    if(QDir().exists(current_locale_text.c_str())) std::cout << "Path is good!" << endl;
    //ouvrir .avi
    capture = new VideoCapture(current_locale_text);
    //check ouverture
    if(!capture->isOpened())
        cout << "probleme ouverture fichier video" << endl;
    //calculer delay between each frame in ms
//    rate = capture->get(CV_CAP_PROP_FPS);
//    delay = 1000 / rate;
    //demarrer timer recordId
    recordId = startTimer(100);
    //capture premiere frame
    if(!capture->read(in))
        cout << "probleme lecture frame fichier video" << endl;
}
Run Code Online (Sandbox Code Playgroud)

使用该代码,我能够打开一些avi文件,但不是全部(实际上远非如此).所以我想我肯定有一个编解码器问题...有没有人能告诉我如何在Ubuntu下解决这个问题?不要让我为那个人继续赏金!非常感谢你.

[编辑3]正如Etienne所建议的那样,我按照这里的指示尝试将我的视频转换为所有平台上OpenCV支持的I420格式,使用带有命令行的mencoder.根据VLC,我从24位RGB(RV24)编解码器转到Planar 4:2:0 YUV(I420).同样的行为,我仍然无法实现VideoCapture对象.

Stack Overflow上有很多与我相似的未解决案例 ......

CTZ*_*tef 6

我终于设法解决了我的问题.

我做了什么 :

  • 尝试打开一些视频,最终找到一个可行的视频.幸运的是,我只花了3个视频找到一个有效的视频.
  • 用VLC检查编解码器.它是MPEG-4 XVID.
  • 使用mencoder将我想要读取的文件转换为XVID:

    sudo mencoder myFile.avi -ovc lavc vcodec=mpeg4:mbd=2:cbp:trell:vbitrate=300 -ffourcc XVID -o test.avi

我也切换到旧的C功能cvCaptureFromFile().我将回到C++接口,以确保它确实是一个编解码器问题,但我很确定它是([编辑]它是一个编解码器问题).

什么没有奏效 :

  • 在启用Qt支持的情况下重新编译OpenCV