簡體   English   中英

嘗試使用 VideoCapture 和 imshow(),引發 Assertion failed (size.width>0 && size.height>0) in cv::imshow

[英]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實例啟用異常拋出,或者您必須手動檢查。

如果手動檢查,有兩個地方需要檢查:

  1. assert(cap.isOpened()); 在創建/打開VideoCapture實例之后。 如果無法打開,則不會引發異常。 你必須檢查和處理這個。 一個斷言就足夠了,但如果你願意,你可以更優雅地處理它。

  2. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM