我刚刚在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;
}
Windows 7上的[EDIT 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;
}
使用该代码,我能够打开一些avi文件,但不是全部(实际上远非如此)。所以我想我肯定有一个编解码器问题...有没有人能告诉我如何在Ubuntu下解决这个问题?不要让我为那个人继续赏金!非常感谢你。
[编辑3] 正如Etienne所建议的那样,我遵循了here指令,尝试将我的视频转换为所有平台上OpenCV支持的I420格式,使用带有命令行的mencoder。根据VLC,我从24位RGB(RV24)编解码器转到Planar 4:2:0 YUV(I420)。同样的行为,我仍然无法实现VideoCapture对象。
Stack overflow上的THERE IS A LOT OF UNSOLVED CASES与我的相似...
答案 0 :(得分:6)
我终于设法解决了我的问题。
我做了什么:
使用mencoder将我想要阅读的文件转换为XVID:
sudo mencoder myFile.avi -ovc lavc vcodec=mpeg4:mbd=2:cbp:trell:vbitrate=300 -ffourcc XVID -o test.avi
我也切换到旧的 C 函数cvCaptureFromFile()
。我将回到 C ++ 界面,以确保它确实是一个编解码器问题,但我很确定它是( [编辑] 这是一个编解码器问题。)< / p>
什么行不通: