0

こんにちは、次のコードを使用してビデオを再生しようとしています:

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

using namespace cv;

int main(int argc, char** argv)
{
    string filename = "anime.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); // key press to close window
    // releases and window destroy are automatic in C++ interface
}

実行すると、次のエラーが表示されます: project.cpp: In function 'int main(int, char**)':

project.cpp:23:13: error: no match for ‘operator!’ in ‘!frame’
project.cpp:23:13: note: candidates are:
project.cpp:23:13: note: operator!(bool) <built-in>
project.cpp:23:13: note:   no known conversion for argument 1 from ‘cv::Mat’ to ‘bool’
/usr/local/include/opencv2/core/operations.hpp:2220:20: note: bool cv::operator!(const cv::Range&)
/usr/local/include/opencv2/core/operations.hpp:2220:20: note:   no known conversion for argument 1 from ‘cv::Mat’ to ‘const cv::Range&’

助けていただけないでしょうか。私は成功せずに何時間もこれを続けてきました:(

4

1 に答える 1

4

operator!class のオーバーロードがないためcv::Matです。ドキュメントでは、取得に失敗した場合に画像がどうなるかは明確に述べられていません。cv::VideoCapture::operator>>それがfromの実装ですcap.cpp:

VideoCapture& VideoCapture::operator >> (Mat& image)
{
    if(!grab())
        image.release();
    else
        retrieve(image);
    return *this;
}

のドキュメントにcv::Mat:release移動します。mat.hppそして、次の実装を再確認しましょう。

inline void Mat::release()
{
    if( refcount && CV_XADD(refcount, -1) == 1 )
        deallocate();
    data = datastart = dataend = datalimit = 0;
    size.p[0] = 0;
    refcount = 0;
}

したがって、最後に、dataポインターをチェックして、グラブが成功したかどうかを確認できます。

if (!frame.data) break;

cv::VideoCapture::readただし、成功したかどうかを明示的に返すため、この場合は関数スタイルの呼び出しを使用することをお勧めします。

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

HTH

于 2012-12-05T07:02:30.030 に答える