【问题标题】:Assertion failed (size.width>0 && size.height>0)断言失败(size.width>0 && size.height>0)
【发布时间】:2014-01-16 06:14:40
【问题描述】:

我正在使用 Visual Studio Express 2013 和 OpenCV 2.4.7,遵循此 tutorial

我花了几个小时在网上搜索解决方案,包括所有相关的 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 错误:在 cv::imshow,文件 ........\opencv\modules\highgui\src\window.cpp,行中断言失败 (size.width>0 && size.height>0) 261

错误发生在imshow("window", image); 行。当我评论它时,没有任何投诉。


更新:

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

用代码

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

我们可以等待相机启动

【问题讨论】:

  • 不要成为一个顽固分子或任何东西,但如果你把namedWindow("xyz", CV_WINDOW_AUTOSIZE),它会更容易让你(以及后来,其他人)阅读和关注..来找你的问题,可以放在每一行之后设置断点,并告诉我问题到底发生在哪里..?
  • 已按要求编辑问题,如果有任何其他附加信息有帮助,请告诉我
  • 曾以“xyz”为例。对于此示例,您应该输入“window”(t 是窗口的名称,因此在 namedWindowimshow 中应该相同。
  • 检查您的网络摄像头设置是否有效。如果您使用 Skype 或其他网络摄像头软件,请检查它是否正常工作。

标签: c++ visual-studio visual-c++ opencv


【解决方案1】:

这样做:

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;
}

【讨论】:

  • 我在另一个问题中看到了这个并尝试过,但同样的错误仍然存​​在
  • @JohnYeung 你能调试它并告诉我它发生在哪一行之后?
  • 是的,我之前有过这段代码,但为了简单明了,我没有在问题中显示它。但它所做的几乎就是再次打印错误消息
  • 可以在任何位置构建opencv源吗?我认为主要问题出在那儿。或者它可能是 Opencv 2.4.9 上的一个错误?
  • 显然是清理了python的编译文件后才起作用的。
【解决方案2】:

我试过你的代码,对我来说它可以工作(它可视化当前的网络摄像头输入)!
我使用 OpenCV 2.4.7 在 Visual Studio 2012 Ultimate 上运行它。
...
出现错误是因为图片为空,试试这个:

while (true) {
    cap >> image;

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

// delay 33ms
waitKey(33);        
}

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

【讨论】:

    【解决方案3】:
    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);        
    }
    

    这样做肯定对你有用。

    【讨论】:

    • 您应该详细说明为什么这样做。事实上,除了一个错误,没有什么好的解释,如果它可以工作,但不幸的是它没有。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多