R. Laganiere による本 OpenCV 2 Computer Vision Application Programming Cookbook でこれを読んだところです。
指定したビデオ ファイルを開くには、コンピュータに対応するコーデックがインストールされている必要があることに注意してください。インストールされていない場合、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;
}
[編集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が提案したように、ここの指示に従い、すべてのプラットフォームで OpenCV でサポートされていると思われる I420 形式にビデオを変換しようとしました。コマンド ラインを指定して mencoder を使用しました。そこで、VLC によると、24 ビット RGB (RV24) コーデックから Planar 4:2:0 YUV (I420) に移行しました。ただし、同じ動作ですが、まだ VideoCapture オブジェクトをインスタンス化できません。
スタック オーバーフローには、私のような未解決のケースがたくさんあります...