Утверждение не выполнено (size.width> 0 && size.height> 0)

Я использую Visual Studio Express 2013 с OpenCV 2.4.7, следуя этому учебнику.

Я потратил часы на поиски в Интернете решений, включая все соответствующие вопросы SO. Я пробовал:

  • возвращаемое значение VideoCapture::open равно 1

  • расширение задержки waitKey() до 50 мс и более поздних 500 мс

  • установка размеров окна

  • создание другого проекта на Visual С++

  • открытие существующего изображения вместо чтения с камеры (та же ошибка)

но не повезло, пожалуйста, помогите!

Здесь мой код:

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

мы можем дождаться начала работы камеры

Ответы

Ответ 1

Я пробовал свой код, и для меня он работает (он визуализирует текущий ввод веб-камеры)!
Я запускал его на Visual Studio 2012 Ultimate с OpenCV 2.4.7.
...
Ошибка возникает из-за того, что изображение пуст, поэтому попробуйте следующее:

while (true) {
    cap >> image;

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

// delay 33ms
waitKey(33);        
}

Возможно, первое изображение, которое вы получаете с веб-камеры, пуст. В этом случае imshow не будет вызывать ошибку. Поэтому, надеюсь, следующие входные изображения не пусты.

Ответ 2

Сделайте это:

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

Ответ 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);        
}

Сделайте это, это сработает для вас наверняка.