Утверждение не выполнено (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);
}
Сделайте это, это сработает для вас наверняка.