繁体   English   中英

使用opencv显示视频

[英]Displaying video using opencv

嗨,我正在尝试使用以下代码播放视频:

//#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:在函数'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&’

你能帮忙吗? 我已经花了几个小时没有成功了:(

因为没有operator! 为类cv::Mat重载。 在文档中 ,没有明确说明,如果采集失败,应该如何处理图像。 那就是来自cap.cppcv::VideoCapture::operator>>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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM