[英]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.cpp
的cv::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.