3

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 オブジェクトをインスタンス化できません。

スタック オーバーフローには、私のような未解決のケースがたくさんあります...

4

1 に答える 1

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 を再コンパイルする
于 2012-06-28T02:18:30.103 に答える