gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:02:58 24 4
gpt4 key购买 nike

我刚刚在 R. Laganiere 的 OpenCV 2 Computer Vision Application Programming Cookbook 一书中读到了这个:

It is important to note that in order to open the specified video file, your computer must have the corresponding codec installed, otherwise cv::VideoCapture will not be able to understand the input file. Normally, if you are able to open your video file with a video player on your machine (such as the Windows Media Player), then OpenCV should also be able to read this file.

不幸的是,事情对我来说并不那么容易。是的,我可以在我的视频播放器上读取 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;
}

[编辑 2] 在 Windows 7 上测试

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

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

[编辑 3]根据 Etienne 的建议, 我按照说明操作 here并尝试使用带有给定命令行的 mencoder 将我的视频转换为 OpenCV 在所有平台上支持的 I420 格式。因此,根据 VLC,我从 24 位 RGB (RV24) 编解码器转到平面 4:2:0 YUV (I420)。虽然行为相同,但我仍然无法实例化 VideoCapture 对象。

THERE IS A LOT OF UNSOLVED CASES类似于我在 Stack Overflow 上的...

最佳答案

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

我做了什么:

  • 尝试打开一些视频,最终找到一个可行的视频。幸运的是,我只用了 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++ 界面以确保它确实是一个编解码器问题,但我很确定它是([EDIT] 这是一个编解码器问题)。

什么不起作用:

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

关于ubuntu - 使用 OpenCV 打开和读取 avi 文件 - Ubuntu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11194713/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com