問題:使用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)