您的位置:首页 > 运维架构

OpenCV2.4.11调用摄像头显示拍摄视频出错

2016-11-25 21:32 459 查看
问题:使用OpenCV2.4.11调用摄像头显示拍摄视频时报runtime error,控制台窗口出现OpenCV Error: Assertion failed (size.width>0 && size.height>0) in cv::imshow, file ……..\opencv\modules\highgui\src\window.cpp, line 261。

解决方法:在显示图片时先判断是否有数据,如下:

if (!image.empty())
{
imshow("window", image);
}




if (image.data)
{
imshow("window", image);
}


原因可能是:我们用opencv打开视频的时候,会自动先监测摄像头有没有读到帧,如果没有,就会报错,然后再执行你的程序,而一般打开摄像头会有一定时间的延迟。有人认为原因是在VideoCapture刚开始获取摄像头视频流的过程不返回信号,所以判断Mat是否为空,并不断循环去获取Mat。加一个if判断就是跳过系统自己的判断,直接执行我们的程序。

附完整示例程序:

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

// 调用摄像头
void videoCapture()
{
//cv::VideoCapture cap(0);  // 打开默认摄像头,参数0代表默认摄像头的ID
cv::VideoCapture cap;
cap.open(0);
// 设置摄像头
cap.set(CV_CAP_PROP_FRAME_WIDTH,640);
cap.set(CV_CAP_PROP_FRAME_HEIGHT,480);
// 确认是否成功打开摄像头
if (!cap.isOpened())
{
printf("打开摄像头失败,退出!\n");
exit(-1);
}
cv::namedWindow("Capture", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
while (1)
{
cv::Mat frame;
cap >> frame;   // 获取帧

// 对摄像头获取的帧进行各种处理
if (!frame.empty()) // 最好加上该判断,并在该判断中对帧进行处理
{
cv::imshow("Capture", frame);
}
if(cv::waitKey(30) >= 0) break; // 每30ms取一帧
}
}

int main(int argc, char *argv[])
{
videoCapture();

return 0;
}


参考资料:

1. OpenCV2.3使用摄像头和视频http://blog.sina.com.cn/s/blog_a3e7ccd6010105yn.html

2. OpenCV Error: Assertion failed (size.width>0 && size.height>0) in cv::imshow, fi 这个问题怎么办?http://zhidao.baidu.com/link?url=pIM9Hr0-Yalk-uj8cm5ml0y91X92jJmPAXMKQ-1h7FXSPsrwTiD6_9Ngfq72hmxbVDjNE0aYTOmXCCVEryZvhNBJGW6FbsqjO6dbjVLEZt3

3. OpenCV打开摄像头出现运行错误OpenCV Error:Assertion failed (size.width>0&&size.height>0)in cv::imshow,…… http://blog.csdn.net/czl389/article/details/51031100

4. [OpenCV]获取摄像头视频http://www.cnblogs.com/tiny656/p/3538115.html?utm_source=tuicool&utm_medium=referral
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opencv 摄像头