我刚刚在 R. Laganiere 的《OpenCV 2 计算机视觉应用编程手册》一书中读到了这一点:
需要注意的是,为了打开指定的视频
文件,您的计算机必须安装相应的编解码器,
否则 cv::VideoCapture 将无法理解输入
文件。通常,如果您能够打开带有视频的视频文件
机器上的播放器(例如 Windows Media Player),然后是 OpenCV
也应该能够读取这个文件。
不幸的是,事情对我来说并不那么容易。是的,我可以在视频播放器上读取 avi 文件,但它不适用于我的 OpenCV-Qt 应用程序。 VideoCapture isOpen() 方法返回 false,尽管路径是正确的,并且所需的每个编解码器似乎都在这里。我尝试了几个文件,所以它与一种特定格式无关。
这里有人有在 Ubuntu 中使用 OpenCV 打开 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 https://stackoverflow.com/users/461338/etienne,我按照说明进行操作here http://opencv.willowgarage.com/wiki/VideoCodecs并尝试使用 mencoder 和给定的命令行将我的视频转换为 OpenCV 在所有平台上支持的 I420 格式。因此,根据 VLC,我从 24 位 RGB (RV24) 编解码器改为 Planar 4:2:0 YUV (I420)。但同样的行为,我仍然无法实例化 VideoCapture 对象。
有很多未解决的案件 https://stackoverflow.com/questions/6971231/first-time-using-open-cv-not-able-to-play-avi-file与我在 Stack Overflow 上的类似...