8

openCVで読み込んで表示したいビデオengine2.aviがあります。これが私のコードです:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;

int main(int argc, char** argv)
{
    string filename = "D:\\BMDvideos\\engine2.avi";
    VideoCapture capture(filename);
    Mat frame;

    if( !capture.isOpened() )
        throw "Error when reading steam_avi";

    namedWindow("w", 1);
    for( ; ; )
    {
        capture >> frame;
        //if(!frame)
        //    break;
        imshow("w", frame);
        waitKey(20); // waits to display frame
    }
    waitKey(0);
}

ファイルにコーデックが含まれている場合 (Direct-Show を使用してビデオを録画した場合)、このコードは機能しませんが、YUV 4:2:2 (UYVY)openCV で取得したビデオを使用すると機能します !!

これがどのように機能するか考えている人はいますか?

アップデート:

例外をキャッチすると問題が解決することを示唆するいくつかのリンクを読んだ後、コードを変更しました。役に立ちませんでしたが、変更されたコードは次のとおりです。

cv::VideoCapture cap("d:\\BMDvideos\\engine2.avi");
cv::Mat frame;

try
{
    cap >> frame;
}
catch(cv::Exception ex)
{
    std::cout << ex.what() << std::endl;
}
catch(...)
{
    std::cout << "Unknown exception" << std::endl;  
}

でプログラムがクラッシュしcap>>frameます。同様の質問を読みましたが、YUV (4:2:0) のフレームを使用していますが、私のビデオには UYVY (4:2:2) があります。これをRGBカラーモデルに変換するにはどうすればよいですか?

更新 2:

karlphillip の提案の後、OpenCV2.4.3 を使用しましたが、以下のコードを使用しても同じエラーが発生しました。

#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\opencv.hpp>
using namespace cv;
using namespace std;

int main(){
    cv::Mat frame;
    cv::VideoCapture cap("d:\\BMDvideos\\B\\Aufnahme.avi");
    if(!cap.isOpened())
    {
        cout << "Error can't find the file"<<endl;
    }

    while(1){
        if(!cap.read(frame))
            imshow("",frame);

        cv::waitKey(33);
    }
    return 0;
}
4

3 に答える 3

10

ここにあなたを助けるかもしれないいくつかのリンクがあります:

編集

最初に何かをクリアする必要があります。OpenCV はビデオ ファイルから YUV フレームを読み取ることができます。これは、ジョブを実行する基礎となるライブラリ (FFmpeg/GStreamer) であるためです。OpenCV は、 または を使用して、特定のタイプの YUV と RGB の間の変換もサポートしていますcvCvtColor()CV_YCrCb2RGBCV_RGBYCrCb

あなたの質問をもう一度調べたところ、発生したエラーの種類を指定していないことに気付きました。メッセージを画面に出力する代わりに、画面にメッセージを出力することで、キャプチャ インターフェイスから発生する可能性のある障害うまく対処できます。 throw

あなたが共有したビデオ ファイルをテストしましたが、次のコードを使用してウィンドウで問題なく再生できました。

#include <cv.h>
#include <highgui.h>

#include <iostream>

int main(int argc, char* argv[])
{
    cv::VideoCapture cap(argv[1]);
    if (!cap.isOpened())
    {
        std::cout << "!!! Failed to open file: " << argv[1] << std::endl;
        return -1;
    }

    cv::Mat frame;
    for(;;)
    {

        if (!cap.read(frame))             
            break;

        cv::imshow("window", frame);

        char key = cvWaitKey(10);
        if (key == 27) // ESC
            break;
    }

    return 0;
}

何らかの理由でキャプチャ インターフェイスがファイルを開くことができなかった場合は、アプリケーションをすぐに終了しますcap.read(frame)

于 2013-02-12T18:12:34.647 に答える
0

ビデオを表示するだけの場合は、これが私のために働いたコードです。何らかの形で役立つかどうかを確認してください。

#include <stdio.h>
#include <opencv2/opencv.hpp>
int main(){
CvCapture *camera=cvCaptureFromFile("C:\\test.avi");
if (camera==NULL)
    printf("camera is null\n");
else
    printf("camera is not null");

cvNamedWindow("img");
while (cvWaitKey(10)!=atoi("q")){
    double t1=(double)cvGetTickCount();
    IplImage *img=cvQueryFrame(camera);
    /*if(img){
        cvSaveImage("C:/opencv.jpg",img);
    }*/
    double t2=(double)cvGetTickCount();
    printf("time: %gms  fps: %.2g\n",(t2-t1)/(cvGetTickFrequency()*1000.), 1000./((t2-t1)/(cvGetTickFrequency()*1000.)));
    cvShowImage("img",img);
}
cvReleaseCapture(&camera);
}

これがお役に立てば幸いです。

于 2013-12-18T10:27:34.243 に答える