Prakash1206 Ответов: 1

Ошибка IP-камеры Opencv


Я использую приложение andriod (IP webcam) в качестве ip-камеры. я запускаю ниже код в отдельном потоке. потому что, если я запускаю в основном потоке, это приводит к сбою программы.

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


все работает нормально. даже если я выключу камеру(закрою приложение andriod), он напечатает "камера закрыта" в консоли. Проблема возникает, когда я выключаю Wi-Fi на своем устройстве andriod. в тот момент, когда я отключаю Wi-Fi напрямую(приложение все еще работает), поток зависает, даже если он находится в блоке try catch!

у меня есть событие button_click в моей форме, и я вызываю в нем Cap.release ();. если я нажму эту кнопку, то в visual studio появится следующая ошибка (нет ошибки из opencv)

HEAP[Test.exe]: HEAP: Free Heap block 6797780 modified at 67977d4 after it was freed Windows has triggered a breakpoint in Test.exe.

   This may be due to a corruption of the heap, which indicates a bug in Test.exe or any of the DLLs it has loaded.

   This may also be due to the user pressing F12 while Test.exe has focus.

   The output window may have more diagnostic information.


Кто-нибудь сталкивался с этой ошибкой?
Отладчик Visual Studio останавливается в строке cap.release();

Есть ли способ преодолеть эту проблему?

Спасибо и с уважением

P. S: Я использую Visual Studio 2013 с opencv 3.0 [C++/Cli (winforms)]

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

Авария происходит с колпачком.~VideoCapture(); в button_clickEvent. Но никакого сбоя на img. release нет();

KarstenK

Похоже, проблема заключается в извлечении данных Wi-Fi, и это убивает приложение. Я бы попробовал сторожевой поток, который проверяет жизнь вашего потока камеры и перезапускает его, когда это необходимо.

Prakash1206

Привет Карстенк
Спасибо за ваш ценный ответ, он звучит как решение этой проблемы.
не знал о сторожевом потоке, но я могу разобрать, когда поток мертв.. я использовал целое число и продолжал увеличивать его до тех пор, пока поток не был мертв (я выключил Wi-Fi)
теперь проблема в том, что если я использую thread- & gt;Abort (); [попытка перезапустить поток], он вылетает! [сообщение об ошибке такое же, как показано в вопросе]

знаете ли вы какой-нибудь другой способ преодолеть эту головную боль?

Спасибо

1 Ответов

Рейтинг:
2

KarstenK

Если вы прочитаете и поймете сообщение об ошибке, оно скажет вам правду: вы работали с варварской памятью.

Такие тексты - Золотая тропа для поиска проблем. Учитесь гуглить после таких текстовых ошибок!!!

Вы не можете "перезапустить" поток, потому что это "зомби". Освободите объекты и создайте новые экземпляры всех объектов!!! (при необходимости перепишите код заново)

Пожалуйста, прочтите и постарайтесь понять С динамическим выделением памяти . Это звучит глупо, но это, как это работает. Перейдите по некоторым ссылкам и добавьте их в закладки. Через несколько месяцев вы, возможно, поймете это. ;-)


Prakash1206

@KarstenK, извините за задержку с ответом.

Спасибо за ваш ценный ответ.
когда я пытаюсь освободить объекты в этом потоке, он снова выходит из строя.
например: cap. release (); это вызывает сбой. итак, есть ли безопасный способ освободить объекты?