首页 文章

断言失败(size.width> 0 && size.height> 0)

提问于
浏览
18

我正在使用Visual Studio Express 2013和OpenCV 2.4.7 ,跟随tutorial .

我花了几个小时在网上搜索解决方案,包括所有相关的SO问题 . 我试过了:

  • VideoCapture::open 的返回值为1

  • 将waitKey()延迟扩展到50ms,然后延长500ms

  • 设置窗口的尺寸

  • 在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错误:cv :: imshow中的断言失败(size.width> 0 && size.height> 0),文件........ \ opencv \ modules \ highgui \ src \ window.cpp,第261行

imshow("window", image); 行发生错误 . 当我评论它时,没有抱怨 .


更新:

这个错误发生原因的合理解释是我的网络摄像头需要时间来启动,这就是为什么image.empty()最初是真的,因此调用abort()函数来退出程序 .

随着代码

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

我们可以等待相机启动

3 回答

  • 0

    我尝试了你的代码,对我来说它是有效的(它可视化当前的网络摄像头输入)!
    我使用OpenCV 2.4.7在Visual Studio 2012 Ultimate上运行它 .
    ...
    发生错误是因为图像为空,请尝试以下操作:

    while (true) {
        cap >> image;
    
        if(!image.empty()){
            imshow("window", image);
        }
    
    // delay 33ms
    waitKey(33);        
    }
    

    也许您从网络摄像头收到的第一张图片是空的 . 在这种情况下,imshow不会抛出错误 . 所以希望下一个输入图像不是空的 .

  • 16

    做这个:

    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;
    }
    
  • 0
    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);        
    }
    

    这样做肯定会对你有用 .

相关问题