[英]Visual Studio 2015 OpenCV Assertion failed (size.width>0 && size.height>0) in cv::imshow windows.cpp
[英]trying to use VideoCapture and imshow(), raises Assertion failed (size.width>0 && size.height>0) in cv::imshow
我按照本教程使用 Visual Studio Express 2013 和 OpenCV 2.4.7
。
我花了幾個小時在網上搜索解決方案,包括所有相關的 SO 問題。 我試過了:
VideoCapture::open
的返回值為 1
將 waitKey() 延遲延長至 50 毫秒,之后延長至 500 毫秒
設置窗口的尺寸
在 Visual C++ 上創建另一個項目
打開現有圖像而不是從相機讀取(同樣的錯誤)
但沒有運氣,請幫忙!
這是我的代碼:
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <iostream>
using namespace std;
using namespace cv;
int main() {
Mat image;
VideoCapture cap;
int camOpen = cap.open(CV_CAP_ANY);
namedWindow("window", CV_WINDOW_AUTOSIZE);
while (true) {
cap >> image;
imshow("window", image);
// delay 33ms
waitKey(33);
}
}
當我編譯並運行它時,出現以下錯誤:
OpenCV 錯誤:斷言失敗 (size.width>0 && size.height>0) 在 cv::imshow,文件.......\opencv\modules\highgui\src\window.cpp,第 261 行
錯誤發生在imshow("window", image);
. 當我評論出來時,沒有任何抱怨。
更新:
出現此錯誤的一個合理解釋是我的網絡攝像頭需要時間才能啟動,這就是為什么 image.empty() 最初為真,因此調用 abort() 函數退出程序。
用代碼
if (!image.empty()) {
imshow("window", image);
}
我們可以等待相機啟動
我嘗試了你的代碼,對我而言它是可行的(它可視化當前的網絡攝像頭輸入)!
我使用OpenCV 2.4.7在Visual Studio 2012 Ultimate上運行它。
...
發生錯誤是因為圖像為空,請嘗試以下操作:
while (true) {
cap >> image;
if(!image.empty()){
imshow("window", image);
}
// delay 33ms
waitKey(33);
}
也許您從網絡攝像頭收到的第一張圖片是空的。 在這種情況下,imshow不會拋出錯誤。 所以希望下一個輸入圖像不是空的。
做這個:
VideoCapture cap;
cap.set(CV_CAP_PROP_FRAME_WIDTH, 640);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 480);
int camOpen = cap.open(CV_CAP_ANY);
或者你可以嘗試改變這個:
while (true) {
cap >> image;
imshow("window", image);
// delay 33ms
waitKey(33);
}
至
try
{
cap >> image;
imshow("window", image);
waitKey(33);
}
catch (Exception& e)
{
const char* err_msg = e.what();
std::cout << "exception caught: imshow:\n" << err_msg << std::endl;
}
int i=0;
while(i<4)
{
VideoCapture cap(0); // force camera to open 4 tiMEs
i++;
}
waitKey(5000);
VideoCapture cap(0);
int camOpen = cap.open(CV_CAP_ANY);
namedWindow("window", CV_WINDOW_AUTOSIZE);
while (true) {
cap >> image;
imshow("window", image);
waitKey(33);
}
這樣做肯定會對你有用。
始終檢查錯誤。
您可以從VideoCapture
實例啟用異常拋出,或者您必須手動檢查。
如果手動檢查,有兩個地方需要檢查:
assert(cap.isOpened());
在創建/打開VideoCapture
實例之后。 如果無法打開,則不會引發異常。 你必須檢查和處理這個。 一個斷言就足夠了,但如果你願意,你可以更優雅地處理它。
if (image.empty()) break;
在每個cap >> image;
, 或者if (.cap;read(image)) break;
而不是cap.read(image);
,因為視頻流可能已結束或相機出現問題。 同樣,沒有拋出自動異常。 你需要檢查和處理這個。 read()
可能會間歇性地失敗(即下一個read()
再次工作),但這種情況很少見。 通常,一旦read()
失敗,該 VideoCapture 實例上的所有后續read()
調用也將失敗。
有VideoCapture::setExceptionMode()
,它允許read()
和open()
調用實際拋出異常,而不是默默地失敗。 在那種情況下,您仍然必須捕獲異常並檢查它( e.what()
)。 如果您沒有明確地捕獲和檢查異常,運行時可能只是打印到 stderr ,表明發生了一些異常,但沒有詳細信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.