Member 12761317 Ответов: 1

Сбой модуля Opencv_ffmpeg (IP-камера)


Я использую приложение IP webcam для android (оно преобразует мобильную камеру в IP-веб-камеру).
Я запускаю ниже код в Visual Studio 2015 с OpenCV 3.1.


VideoCapture cap; Mat img;
    cap.open("http://192.168.0.101:8080/video?x.mjpeg");
    while(waitKey(33)!=27)
    {
        try{
            cap>>img;  //code crashes here
            if(img.empty())
            {
             cout<<"camera Closed"<<endl;
             break;
            }
             imshow("Video",img);
          } catch(...{}    
    }
Получение ниже ошибки.если интернет-соединение медленное или если Wi-Fi отключен на моем android-устройстве, программа выходит из строя

Ошибка:

Exception thrown at 0x0BF2F6F0 (opencv_ffmpeg310.dll) in test.exe:<br />
 0xC0000005: Access violation reading location 0x00000020.<br />
 <br />
 If there is a handler for this exception, the program may be safely<br />
 continued.


даже если код завернут в блок try catch, он вылетает!


Должен ли я использовать блок try {} catch (...) в исходном файле, если да, то где я должен его использовать?


Что я уже пробовал:

Я сослался на эту ссылку ссылка но не нашел правильного ответа.

Arthur V. Ratz

Я надеюсь, что использование механизма обработки исключений try {} catch (...) не поможет вам в этом случае. Прочтите мое решение ниже.

1 Ответов

Рейтинг:
2

Arthur V. Ratz

Обычно в этом коде в самом начале объявляются две переменные:

VideoCapture cap; Mat img;
Обычно вы открываете камеру, вызывая
cap.open("http://192.168.0.101:8080/video?x.mjpeg");
метод, а затем выполните цикл для извлечения каждого кадра из устройства камеры, хранящего их в матрице кадров, представленной
Mat img
объект. Во время первой итерации следующего цикла вы просто обычно извлекаете первый кадр из потока камеры с помощью
cap
обработайте объект и сохраните его в матрице
img
. * Но* для следующих итераций вы используете тот же объект
img
который не является пустым, содержащим матрицу предыдущего кадра. Именно поэтому, на мой взгляд, ваше приложение выходит из строя, так как вам нужна пустая матрица для каждой выборки кадра во время выполнения цикла. Попробуйте объявить
Mat img
объект в области действия следующего цикла, как я показал ниже:

VideoCapture cap;
    cap.open("http://192.168.0.101:8080/video?x.mjpeg");
    while(waitKey(33)!=27)
    {
        try{
            Mat img;
            cap>>img;  //code crashes here
            if(img.empty())
            {
             cout<<"camera Closed"<<endl;<!-- newline="" --="">             break;
            }
             imshow("Video",img);
          } catch(...{}    
    }</endl;<!-->